【发布时间】:2010-06-18 13:01:01
【问题描述】:
谁能告诉我什么时候使用 Dispatcher 以及什么时候使用 SynchronizationContext 类?
一段时间以来,我一直在使用Dispatcher 从后台线程排队任务,然后我发现了SynchronizationContext。
【问题讨论】:
标签: wpf dispatcher synchronizationcontext
谁能告诉我什么时候使用 Dispatcher 以及什么时候使用 SynchronizationContext 类?
一段时间以来,我一直在使用Dispatcher 从后台线程排队任务,然后我发现了SynchronizationContext。
【问题讨论】:
标签: wpf dispatcher synchronizationcontext
AFAIK,当使用 WPF 时,SynchronizationContext.Current 对象的类型是 DispatcherSynchronizationContext,它实际上只是 Dispatcher 对象的一个包装器,Post 和 Send 方法只是委托给 Dispatcher.BeginInvoke 和 Dispatcher.Invoke .
因此,即使您决定使用SynchronizationContext,我认为您最终还是会在幕后调用调度程序。
此外,我认为使用 SynchronizationContext 有点麻烦,因为您必须将对当前上下文的引用传递给需要调用 UI 的所有线程。
【讨论】:
当您的代码与 WPF 紧密耦合时使用 Dispatcher。
当您需要在“上下文”线程上排队时使用 AsyncOperationManager。这也适用于 Windows 窗体、ASP .NET 和 WCF 应用程序。
避免自己使用 SynchronizationContext。 AsyncOperationManager 在内部使用这种机制。
【讨论】:
AsyncOperationManager 将委托排队以便在“上下文”(UI)线程上执行。我知道SynchronizationContext 是如何工作的;但我不知道AsyncOperation 应该如何工作。 (我目前的想法是,它更像是一个“令牌”,用于跟踪异步操作的状态和进度,但无助于实际安排委托执行。)