【问题标题】:Any scenario where Task.ContinueWith(..., TaskScheduler.FromCurrentSynchronizationContext()) would *not* run on the UI thread?Task.ContinueWith(..., TaskScheduler.FromCurrentSynchronizationContext()) 的任何场景*不会*在 UI 线程上运行?
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    相关资源
    最近更新 更多