在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);
});
答案 0 :(得分:0)
两者都会做同样的事情并且会有自己的优势。
• Dispatcher.BeginInvoke():只是在UI线程上更新某些内容 Dispatcher.BeginInvoke 是最佳选择。通常,这是为了使用在后台线程上执行的某些操作的结果来更新某些UI控件。 Dispatcher.Invoke调用将阻塞,直到此操作完成。我们不应该在这里执行冗长的操作。
Dispatcher.BeginInvoke( () =>{myLabel.Text = "myText"});
• Task.Factory.StartNew():将多个任务组合在一起时非常有用。这使得依赖于先前任务的调度工作变得更加简单,因为您可以使用Task.WaitAll / Task.WaitAny以及continuation。