2010-06-18 4 views
12

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

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

ответ

16

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

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

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

+3

Почему downvote? –

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

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

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

+0

Я понимаю, что вы написали этот ответ некоторое время назад. Тем не менее, мне было бы очень интересно, если бы вы могли привести конкретный пример того, как использовать 'AsyncOperationManager' для очереди делегата для выполнения в потоке контекста (UI). Я знаю, как работает «SynchronizationContext»; но я не могу понять, как должно работать «AsyncOperation». (В настоящее время у меня есть представление о том, что это скорее «токен» для отслеживания состояния и прогресса асинхронной операции, но не поможет при фактическом планировании делегирования для выполнения.) – stakx

+1

Как использовать AsyncOperationManager: http: // www .codeproject.com/KB/cpp/SyncContextTutorial.aspx – jbe

+0

Что делать, если вам нужно синхронно запускать что-то в потоке пользовательского интерфейса? AsyncOperation не имеет метода Send(), но SynchronizationContext. – Monstieur

Смежные вопросы