9

我们正在观察一些奇怪的东西,代码如下:

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

那里的第二个任务调用一个事件,该事件反过来尝试更新 GUI,我们得到了可怕的跨线程异常。

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

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

是否有任何情况会出错?

4

1 回答 1

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 中修复。

于 2013-03-20T13:32:51.963 回答