为什么如果从静态构造函数启动并等待,则无法完成空的.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中,没有你正在做什么/在哪里的上下文,它是有效的。
即便是这种憎恶行为:
上述就是C#学习教程:为什么如果从静态构造函数启动并等待,则无法完成空的.NET任务?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
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"); }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/991649.html