【发布时间】:2014-08-14 22:20:51
【问题描述】:
在 WPF 中,Dispatcher 和 taskscheduler 都有助于将值从后台线程传递到 UI 线程。所以他们之间真的有什么区别。 例如在下面的代码中,选项 1 和选项 2 之间的实际区别是什么
Task<int> tsk = Task<int>.Factory.StartNew(TestMethod);
var threadSchedulder = TaskScheduler.FromCurrentSynchronizationContext();
//Option 1
tsk.ContinueWith((t) =>
{
SetText(tsk.Result);
}, threadSchedulder);
//Option 2
this.Dispatcher.Invoke(() =>
{
SetText(tsk.Result);
});
【问题讨论】:
-
Task<int> tsk = Task<int>.Factory...- 老兄,请使用var,C#不是java。 -
他们没有共同点。 TaskScheduler.FromSynchronizationContext() 知道如何使用 SynchronizationContext.Current,它知道如何使用 Dispatcher.BeginInvoke() 让任务在 WPF 应用程序的 UI 线程上运行。使用 TaskScheduler 的优势在于,当您的代码不在 WPF 应用程序中运行时,它仍然可以工作。缺点是当你不在 UI 线程上创建 Task 时它将无法完成它的工作。
-
@HansPassant 在实际意义上(从 OP 的“消费者”代码)的角度来看,它们几乎相同..
-
在 wpf 中,使用 dispatcher 更清楚你的意图,因为这是推荐的方式