如果从静态构造函数启动并等待,为什么空的.NET任务不会完成?

Erw*_*yer 6 .net c# wpf asynchronous task-parallel-library

我无法理解为什么以下代码不起作用:

var task = new Task(() => { });
task.Start();
if (task.Wait(10000))
{
   logger.Info("Works");
}
else
{  
   logger.Info("Doesn't work");
}
Run Code Online (Sandbox Code Playgroud)

超时到期后,任务状态停留在"正在运行",尽管没有任何事情要做.更换task.Start()同task.RunSynchronously()但是会工作.

有没有人知道我可能做错了什么?

可以在此处找到复制该问题的测试项目:http://erwinmayer.com/dl/TaskTestProject.zip.据我所知,如果具有上述代码的方法在静态构造函数中运行,则它不起作用.但是如果直接作为静态类方法调用它就可以工作.

最近这篇MSDN博客文章似乎突出了静态构造函数的相关问题:http://blogs.msdn.com/b/pfxteam/archive/2011/05/03/10159682.aspx

Jon*_*eet 10

背景在这里非常重要.当你启动这样的任务时,它会使用当前的调度程序 - 如果它假设它能够使用当前线程,那么当你等待时它会有效地死锁.

不同上下文中的相同代码也没问题.

其他人说它为他们工作的原因,但它不适合你,是因为毫无疑问你在不同的环境中运行这些代码给其他人 - 但你没有向我们展示一个简短而完整的程序,只是这个片段,所以每个人都试图以不同的方式重现它.(我看到你现在已经上传了一个项目,毫无疑问会有更多的亮点.当然,一个简短而完整的程序可以在问题中发布.)

  • 在Jon Skeet出生并且他们仍在死亡的那天,有超过1,000,000个虫子死亡...... (3认同)
  • @Eric:我会说"静态ctors和阻塞不混合".我倾向于使用静态构造函数精确地*来表示它们的线程行为,就保证一次初始化而言.但是,很明显,静态构造函数位是我们之前缺少的. (2认同)

Erw*_*yer 1

感谢大家的评论,它帮助我更加具体并最终隔离了问题。

我在这里创建了一个测试项目:http://erwinmayer.com/dl/TaskTestProject.zip。它表明我的问题中的代码如果在静态构造函数中运行则不起作用。但如果在静态构造函数初始化后直接作为静态类方法调用,它确实可以工作。

最近的这篇 MSDN 博客文章提供了一些关于处理多线程和静态构造函数时存在的相关问题的技术见解: