SynchronizationContext

SynchronizationContext

我正在使用 Dispatcher 像这样从外部切换到 UI 线程

Application.Current.Dispatcher.Invoke(myAction);

但我在一些论坛上看到有人建议使用 SynchronizationContext 而不是 Dispatcher
SynchronizationContext.Current.Post(myAction,null);

它们之间有什么区别,为什么应该使用 SynchronizationContext?。

最佳答案

它们都有相似的效果,但 SynchronizationContext 更通用。
Application.Current.Dispatcher 指的是应用程序的 WPF 调度程序,使用 Invoke 在该应用程序的主线程上执行委托(delegate)。

另一方面,SynchronizationContext.Current 返回取决于当前线程的不同实现。当在 WPF 应用程序的 UI 线程上调用时,它返回一个使用调度程序的 SynchronizationContext,当在 WinForms 应用程序的 UI 线程上调用时,它返回一个不同的。

您可以在 its MSDN documentation 中看到从 SynchronizationContext 继承的类: WindowsFormsSynchronizationContextDispatcherSynchronizationContext

使用 SynchronizationContext 时要注意的一件事是它返回 当前 线程的同步上下文。如果要使用另一个线程的同步上下文,例如在 UI 线程中,您必须首先获取其上下文并将其存储在一个变量中:

public void Control_Event(object sender, EventArgs e)
{
    var uiContext = SynchronizationContext.Current;
    Task.Run(() =>
    {
        // do some work
        uiContext.Post(/* update UI controls*/);
    }
}

这不适用于 Application.Current.Dispatcher ,它总是返回应用程序的调度程序。

关于c# - Synchronization Context 和 Dispatcher 的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24671883/

10-17 00:26