Тэги

Silverlight (36) WPF (10) IIS (7) Visual Studio (7) SharePoint (6) .Net Framework (5) ODP.NET (5) ASP.NET (4) C# (4) common (4) Network Settings (3) JavaScript (2) MS Office (2) Resharper (2) WCF (2) WEB (2) XPath (2) XSLT (2) ADO.NET (1) APEX (1) CMD (1) CSS (1) EF (1) HTML (1) Hardware bugs (1) Java (1) MS SQL (1) Oracle (1) PDF (1) Version Control (1) XAML (1)

среда, 19 января 2011 г.

WPF/Silverlight Tips: Коварное статическое свойствоDispatcher.CurrentDispatcher - не используйте.

Не используйте свойство Dispatcher.CurrentDispatcher!!!
Или - используйте его по назначению, что фактически означает - "не используйте его никогда, чтоб не попасть в просак".

Вместо него нужно использовать
В WPF - Application.Current.Dispatcher.
В Silverlight - Deployment.Current.Dispatcher.

Дело в том, что Dispatcher.CurrentDispatcher вернет диспатчер для текущего потока или создаст новый для потока, в котором нет еще диспатчера.
Если вы работаете в потоке вашего UI, то все о.к., вы получите Dispatcher вашего UI-приложения.
Но если вы работаете во внешнем потоке, то вы получите диспатчер, который никак не связан с вашими UI элементами и окнами и вы никогда не достучитесь до ваших гуев.

Можно поймать неприятные баги, особенно при активном рефакторинге чужого кода.

Универсальное решение для всех фреймворков
SynchronizationContext.Current

Комментариев нет:

Отправить комментарий