Подтвердить что ты не робот

Диспетчер и синхронизацияКонтекстные классы

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

  • Используйте диспетчер, когда ваш код тесно связан с WPF.

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

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