Task.ContinueWith(...,TaskScheduler.FromCurrentSynchronizationContext())在UI线程上运行的任何场景?

时间:2013-03-20 13:18:34

标签: c# task multithreading synchronizationcontext

我们正在观察奇怪的事情,像这样的代码:

var task = new Task(...); // run in the background, do something lengthy work
task.ContinueWith(..., TaskScheduler.FromCurrentSynchronizationContext());
task.Start();

第二个任务调用一个事件,而事件又试图更新GUI,我们得到了可怕的跨线程异常。

从第二个任务中的方法检查Thread.CurrentThread.ManagedThreadId表示它实际上在UI线程上运行。

产生任务的代码在UI线程上运行。

是否存在出错的情况?

1 个答案:

答案 0 :(得分:4)

假设您使用的是.NET 4.0,则主线程上的System.Threading.SynchronizationContext.Current可能会变为空,并且您会遇到此问题。如果您可以轻松地重现问题,首先要检查的是SynchronizationContext.Current在调用TaskScheduler.FromCurrentSynchronizationContext()时是否为空。

请在此处查看该问题的详细信息:SynchronizationContext.Current is null in Continuation on the main UI thread

该错误已在.NET 4.5中修复。