Wpf Dispatcher和TaskScheduler之间的区别

Wpf Dispatcher和TaskScheduler之间的区别,wpf,c#-5.0,Wpf,C# 5.0,在WPF中,Dispatcher和taskscheduler都有助于将值从后台线程传递到UI线程。那么它们之间的区别是什么呢。 例如,在下面的代码中,选项1和选项2之间的实际区别是什么 Task<int> tsk = Task<int>.Factory.StartNew(TestMethod); var threadSchedulder = TaskScheduler.FromCurrentSynchronizationContext();

在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 tsk=Task.Factory.StartNew(TestMethod);
var threadSchedulder=TaskScheduler.FromCurrentSynchronizationContext();
//选择1
tsk.ContinueWith((t)=>
{
SetText(tsk.Result);
},螺纹排样器);
//选择2
this.Dispatcher.Invoke(()=>
{
SetText(tsk.Result);
});

两者的作用几乎相同,且各有优势

Dispatcher.BeginInvoke():只是更新UI线程上的内容Dispatcher.BeginInvoke是最佳选择。通常,这样做是为了使用在后台线程上执行的某些操作的结果更新某些UI控件。Dispatcher.Invoke调用将阻塞,直到此操作完成。我们不应该在这里执行冗长的行动

Dispatcher.BeginInvoke( () =>{myLabel.Text = "myText"});

Task.Factory.StartNew():将多个任务组合在一起时非常有用。这使得依赖于以前任务的调度工作更加简单,因为您可以使用Task.WaitAll/Task.WaitAny以及continuations。

Task tsk=Task.Factory…
-dude,请使用
var
,C#不是java。它们没有共同点。TaskScheduler.FromSynchronizationContext()知道如何使用SynchronizationContext.Current,它知道如何使用Dispatcher.BeginInvoke()在WPF应用程序的UI线程上运行任务。使用TaskScheduler的优点是,当您的代码没有在WPF应用程序中运行时,它仍然可以工作。缺点是,当您不在UI线程上创建任务时,它将无法完成其工作。@HansPassant从实际意义上(从OP的“消费者”代码)来看,它们几乎是一样的。.在wpf中,使用dispatcher可以更好地明确您的意图,因为这是建议的方法问题是taskscheduler vs dispatcher