C# TaskScheduler.Current和TaskScheduler.FromCurrentSynchronizationContext()的区别?

C# TaskScheduler.Current和TaskScheduler.FromCurrentSynchronizationContext()的区别?,c#,task,scheduler,C#,Task,Scheduler,我有一个任务要从数据库中获取产品,而ContinueWith操作会操作一些UI修改,因此我遇到了一个问题,因为该任务创建了一个新线程,而UI修改不是在UI线程中执行的 我尝试使用此修复程序: var currentScheduler = TaskScheduler.Current; Task.Factory.StartNew(() => { // get products }).ContinueWith((x) => handleProductsArrived

我有一个任务要从数据库中获取产品,而
ContinueWith
操作会操作一些UI修改,因此我遇到了一个问题,因为该任务创建了一个新线程,而UI修改不是在UI线程中执行的

我尝试使用此修复程序:

var currentScheduler = TaskScheduler.Current;

Task.Factory.StartNew(() =>
{    
    // get products   
}).ContinueWith((x) => handleProductsArrived(x.Result, x.Exception), currentScheduler);
但它根本不起作用。我检查后发现,
ContinueWith
不是在currentScheduler的线程中执行的,而是在另一个线程中执行的

我发现了这个方法:

Task.Factory.StartNew(() =>
{
    // get products
}).ContinueWith((x) => handleProductsArrived(x.Result, x.Exception), TaskScheduler.FromCurrentSynchronizationContext());
它是有效的。那么有什么区别呢?为什么我的第一个代码不起作用?
谢谢

来自
TaskScheduler.Current的文档:

当未从任务中调用Current时,Current将返回默认计划程序

然后从:

任务并行库和PLINQ的默认调度程序使用.NET Framework线程池对工作进行排队和执行

因此,如果您不在任务中时使用
TaskScheduler.Current
,您将得到一个使用线程池的调度器

如果调用
TaskScheduler.FromCurrentSynchronizationContext()
,您将得到一个用于当前的上下文,它在Windows窗体或WPF(从UI线程调用时)中是一个用于调度相关UI线程上的工作的上下文

这就是为什么第一个代码不起作用的原因:它在线程池线程上执行您的延续。您的第二个代码在UI线程上执行了延续


请注意,如果您可以使用C#5和async/await,那么所有这些都会得到更简单的处理。

当您不能像在UI组件的构造函数中那样使用async/await时,这非常有用,对吗?@Chin:我不会特别使用它——我通常会使用一个静态异步方法来完成这项工作,然后调用一个快速构造函数。你能详细说明一下吗?特别是我这里还有一个问题:这与that@Chin构造函数()