【发布时间】:2013-03-20 13:18:33
【问题描述】:
我们正在观察一些奇怪的东西,代码如下:
var task = new Task(...); // run in the background, do something lengthy work
task.ContinueWith(..., TaskScheduler.FromCurrentSynchronizationContext());
task.Start();
那里的第二个任务调用一个事件,该事件反过来尝试更新 GUI,我们得到了可怕的跨线程异常。
从第二个任务中的方法检查Thread.CurrentThread.ManagedThreadId 表明它实际上没有在 UI 线程上运行。
生成任务的代码正在在 UI 线程上运行。
是否有任何情况会出错?
【问题讨论】:
-
为什么直接创建任务而不是运行Task.StartNew?
-
@PanagiotisKanavos,这样做可能有正当理由(请参阅blogs.msdn.com/b/pfxteam/archive/2010/06/13/10024153.aspx),但这与问题无关。
-
好吧,我不能重现这个,我也没有遇到这种情况,或者上下文变为空,除非创建任务的调用不是真正在 UI 线程中进行的
-
我要做的第一件事是检查
TaskScheduler.FromCurrentSynchronizationContext在调试器中返回的内容。当你这样做时,你会发现什么? -
@Lasse,你找到这个问题的原因或解决方案了吗?
标签: c# task multithreading synchronizationcontext