Может кто-нибудь сказать мне, когда использовать Dispatcher и когда использовать класс SynchronizationContext?
Некоторое время я использую Dispatcher для очереди задач из фонового потока, затем я обнаружил SynchronizationContext.
Ответ 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 использует этот механизм внутри себя.