我们正在观察奇怪的事情,像这样的代码:
var task = new Task(...); // run in the background, do something lengthy work
task.ContinueWith(..., TaskScheduler.FromCurrentSynchronizationContext());
task.Start();
第二个任务调用一个事件,而事件又试图更新GUI,我们得到了可怕的跨线程异常。
从第二个任务中的方法检查Thread.CurrentThread.ManagedThreadId
表示它实际上不在UI线程上运行。
产生任务的代码在UI线程上运行。
是否存在出错的情况?
答案 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中修复。