【问题标题】:Dispatcher and SynchronizationContext classesDispatcher 和 SynchronizationContext 类
【发布时间】:2010-06-18 13:01:01
【问题描述】:

谁能告诉我什么时候使用 Dispatcher 以及什么时候使用 SynchronizationContext 类?

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

【问题讨论】:

    标签: wpf dispatcher synchronizationcontext


    【解决方案1】:

    AFAIK,当使用 WPF 时,SynchronizationContext.Current 对象的类型是 DispatcherSynchronizationContext,它实际上只是 Dispatcher 对象的一个​​包装器,PostSend 方法只是委托给 Dispatcher.BeginInvokeDispatcher.Invoke .

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

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

    【讨论】:

      【解决方案2】:
      1. 当您的代码与 WPF 紧密耦合时使用 Dispatcher。

      2. 当您需要在“上下文”线程上排队时使用 AsyncOperationManager。这也适用于 Windows 窗体、ASP .NET 和 WCF 应用程序。

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

      【讨论】:

      • 我知道你之前写过这个答案。不过,如果您能提供一个具体示例,我会非常感兴趣如何使用AsyncOperationManager 将委托排队以便在“上下文”(UI)线程上执行。我知道SynchronizationContext 是如何工作的;但我不知道AsyncOperation 应该如何工作。 (我目前的想法是,它更像是一个“令牌”,用于跟踪异步操作的状态和进度,但无助于实际安排委托执行。)
      • 如何使用AsyncOperationManager:codeproject.com/KB/cpp/SyncContextTutorial.aspx
      • 如果你需要在 UI 线程上同步运行一些东西怎么办? AsyncOperation 没有 Send() 方法,但 SynchronizationContext 有。
      猜你喜欢
      • 2011-09-14
      • 2012-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多