我正在使用 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
继承的类: WindowsFormsSynchronizationContext 和 DispatcherSynchronizationContext 。
使用 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/