调度程序和同步上下文类

12

有人能告诉我什么时候使用 Dispatcher,什么时候使用 SynchronizationContext 类吗?

最近我一直在使用 Dispatcher 来排队后台线程的任务,然后我发现了 SynchronizationContext

2个回答

17
据我所知,在使用 WPF 时,SynchronizationContext.Current 对象是 DispatcherSynchronizationContext 类型的,它实际上只是 Dispatcher 对象的包装器,并且 PostSend 方法只是委托给 Dispatcher.BeginInvokeDispatcher.Invoke 方法。
因此,即使您决定使用 SynchronizationContext,我认为您最终也会在幕后调用 dispatcher。
此外,我认为使用 SynchronizationContext 有点麻烦,因为您必须向所有需要调用您的 UI 的线程传递对当前上下文的引用。

4
  1. 如果您的代码与WPF紧密耦合,请使用Dispatcher。

  2. 如果您需要在“上下文”线程上排队某些内容,请使用AsyncOperationManager。这也适用于Windows Forms、ASP .NET和WCF应用程序。

  3. 避免自己使用SynchronizationContext。AsyncOperationManager在内部使用此机制。


我知道您之前写过这个答案。不过,如果您能提供一个具体的示例,说明如何使用AsyncOperationManager将委托排队以在“上下文”(UI)线程上执行,我会非常感兴趣。我知道SynchronizationContext的工作原理;但我无法弄清楚AsyncOperation应该如何工作。(我目前的想法是它更像是用于跟踪异步操作状态和进度的“令牌”,但不能帮助实际安排委托执行。) - stakx - no longer contributing
1
如何使用AsyncOperationManager:http://www.codeproject.com/KB/cpp/SyncContextTutorial.aspx - jbe
如果您需要在UI线程上同步运行某些内容怎么办?AsyncOperation没有Send()方法,但SynchronizationContext有。 - Monstieur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接