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

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

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

超时到期后,任务状态停留在“正在运行”,尽管没有任何事情要做。 但是,使用task.RunSynchronously()替换task.Start()将起作用。

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

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

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

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

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

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

谢谢大家的意见,它帮助我更具体,最终孤立了问题。

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

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

有用:

  var task = new Task(() => { }); task.Start(); if (task.Wait(10000)) { Console.WriteLine("yes"); } else { Console.WriteLine("no"); } 

并按预期给出输出yes 。 你必须做一些导致它不起作用的事情。 在给定的forms中,没有你正在做什么/在哪里的上下文,它是有效的。

即便是这种憎恶行为:

  var task = new Task(() => { var task1 = new Task(() => { }); task1.Start(); if (task1.Wait(10000)) { Console.WriteLine("yes"); } else { Console.WriteLine("no"); } }); task.Start(); if (task.Wait(10000)) { Console.WriteLine("yes"); } else { Console.WriteLine("no"); }