Dispatcher and SynchronizationContext classes
Asked Answered
C

2

12

Can somebody tell me when to use a Dispatcher and when to use the SynchronizationContext class?

For a while now I have been using the Dispatcher to queue up tasks from a background thread, then I discovered the SynchronizationContext.

Cup answered 18/6, 2010 at 13:1 Comment(0)
D
17

AFAIK, when using WPF, the SynchronizationContext.Current object is of type DispatcherSynchronizationContext which is actually just a wrapper around the Dispatcher object and the Post and Send methods just delegate to Dispatcher.BeginInvoke and Dispatcher.Invoke.

So even if you decide to use SynchronizationContext I think you end up calling dispatcher behind the scenes.

Besides I think it is a bit cumbersome to use SynchronizationContext as you have to pass a reference to the current context to all threads that need to call into your UI.

Drily answered 18/6, 2010 at 15:37 Comment(0)
J
4
  1. Use the Dispatcher when your code is tightly coupled to WPF.

  2. Use the AsyncOperationManager when you need to queue something on the 'Context' thread. This works with Windows Forms, ASP .NET and WCF applications as well.

  3. Avoid using the SynchronizationContext yourself. The AsyncOperationManager uses this mechnism internally.

Jasen answered 18/6, 2010 at 16:25 Comment(3)
I realise you've written this answer some time ago. Nevertheless, I would be very interested if you could provide a concrete example how to use AsyncOperationManager to queue a delegate for execution on the "context" (UI) thread. I know how SynchronizationContext works; but I can't figure out how AsyncOperation is supposed to work. (I currently have the notion that it's rather like a "token" for keeping track of a asynchronous operation's state and progress, but won't help with actually scheduling a delegate for execution.)Kaczmarek
How to use AsyncOperationManager: codeproject.com/KB/cpp/SyncContextTutorial.aspxJasen
What if you need to synchronously run something on the UI thread? AsyncOperation doesn't have a Send() method but SynchronizationContext does.Dong

© 2022 - 2024 — McMap. All rights reserved.