Классы Dispatcher и SynchronizationContext - PullRequest
12 голосов
/ 18 июня 2010

Может кто-нибудь сказать мне, когда использовать Dispatcher, а когда использовать класс SynchronizationContext?

Некоторое время сейчас я использую Dispatcher для постановки задач в очередь из фонового потока.Затем я обнаружил SynchronizationContext.

Ответы [ 2 ]

16 голосов
/ 18 июня 2010

AFAIK, при использовании WPF объект SynchronizationContext.Current имеет тип DispatcherSynchronizationContext, который на самом деле является просто оболочкой для объекта Dispatcher, а методы Post и Send просто делегируют Dispatcher.BeginInvoke и Dispatcher.Invoke.

Так что, даже если вы решите использовать SynchronizationContext, я думаю, вы в конечном итоге вызовете диспетчера за кулисами.

Кроме того, я думаю, что использовать SynchronizationContext немного громоздко, поскольку вы должны передавать ссылку на текущий контекст всем потокам, которые должны вызываться в вашем пользовательском интерфейсе.

4 голосов
/ 18 июня 2010
  1. Используйте Диспетчер, когда ваш код тесно связан с WPF.

  2. Используйте AsyncOperationManager, когда вам нужно поставить что-то в очередь в потоке «Context» Это также работает с приложениями Windows Forms, ASP .NET и WCF.

  3. Избегайте использования SynchronizationContext самостоятельно. AsyncOperationManager использует этот механизм внутренне.

...