WPF/Silverlight Tips: Коварное статическое свойствоDispatcher.CurrentDispatcher - не используйте.
Не используйте свойство Dispatcher.CurrentDispatcher!!!
Или - используйте его по назначению, что фактически означает - "не используйте его никогда, чтоб не попасть в просак".
Вместо него нужно использовать
В WPF - Application.Current.Dispatcher.
Дело в том, что Dispatcher.CurrentDispatcher вернет диспатчер для текущего потока или создаст новый для потока, в котором нет еще диспатчера.
Если вы работаете в потоке вашего UI, то все о.к., вы получите Dispatcher вашего UI-приложения.
Но если вы работаете во внешнем потоке, то вы получите диспатчер, который никак не связан с вашими UI элементами и окнами и вы никогда не достучитесь до ваших гуев.
Можно поймать неприятные баги, особенно при активном рефакторинге чужого кода.
Универсальное решение для всех фреймворков
SynchronizationContext.Current
Или - используйте его по назначению, что фактически означает - "не используйте его никогда, чтоб не попасть в просак".
Вместо него нужно использовать
В WPF - Application.Current.Dispatcher.
В Silverlight - Deployment.Current.Dispatcher.
Дело в том, что Dispatcher.CurrentDispatcher вернет диспатчер для текущего потока или создаст новый для потока, в котором нет еще диспатчера.
Если вы работаете в потоке вашего UI, то все о.к., вы получите Dispatcher вашего UI-приложения.
Но если вы работаете во внешнем потоке, то вы получите диспатчер, который никак не связан с вашими UI элементами и окнами и вы никогда не достучитесь до ваших гуев.
Можно поймать неприятные баги, особенно при активном рефакторинге чужого кода.
Универсальное решение для всех фреймворков
SynchronizationContext.Current
Комментарии
Отправить комментарий