2010-06-18 70 views
12

有人可以告诉我何时使用Dispatcher以及何时使用SynchronizationContext类?Dispatcher和SynchronizationContext类

一段时间以来,我一直在使用Dispatcher排列来自后台线程的任务,然后我发现了SynchronizationContext

回答

16

AFAIK,使用WPF的情况下,SynchronizationContext.Current目的是DispatcherSynchronizationContext型实际上是就在分派器对象的包装和PostSend方法只是委托给Dispatcher.BeginInvokeDispatcher.Invoke的。

因此,即使您决定使用SynchronizationContext,我认为您最终会在幕后调用调度程序。

此外,我认为使用SynchronizationContext有点麻烦,因为您必须将对当前上下文的引用传递给所有需要调用到UI中的线程。

+3

为什么downvote? – 2010-06-26 09:59:45

4
  1. 当代码与WPF紧密耦合时使用Dispatcher。

  2. 当您需要在“上下文”线程上对某些内容进行排队时,请使用AsyncOperationManager。这也适用于Windows窗体,ASP .NET和WCF应用程序。

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

+0

我知道你以前写过这个答案。不过,如果你能够提供一个具体的例子来说明如何使用'AsyncOperationManager'在“context”(UI)线程中排队执行委托,我会非常感兴趣。我知道'SynchronizationContext'是如何工作的;但我无法弄清楚'AsyncOperation'应该如何工作。 (我目前有这样一个概念,它就像是一个记录异步操作状态和进度的“标记”,但不会帮助实际调度委托来执行。) – stakx 2011-01-31 20:07:42

+1

如何使用AsyncOperationManager:http:// www .codeproject.com/KB/cpp/SyncContextTutorial.aspx – jbe 2011-01-31 21:06:02

+0

如果您需要在UI线程上同步运行某些内容,该怎么办? AsyncOperation没有Send()方法,但是SynchronizationContext没有。 – Monstieur 2013-06-07 11:29:58

相关问题