Console.ReadKey()
在多线程程序中使用时遇到一个奇怪的问题。
我的问题是:为什么会这样?这是一个错误,还是因为我在滥用Console
?(请注意,根据文档,控制台应该是线程安全的。)
用代码最容易解释这一点:
using System;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
internal class Program
{
private static void Main(string[] args)
{
Console.WriteLine("X"); // Also try with this line commented out.
Task.Factory.StartNew(test);
Console.ReadKey();
}
private static void test()
{
Console.WriteLine("Entering the test() function.");
Thread.Sleep(1000);
Console.WriteLine("Exiting the test() function.");
}
}
}
如果您运行它并且不按任何键,您认为会打印出什么?
答案正是您所期望的:
X
Entering the test() function.
Exiting the test() function.
现在注释掉Console.WriteLine("X")
并再次运行它(不按任何键)。我希望看到这个输出:
Entering the test() function.
Exiting the test() function.
相反,我什么也没看到。然后当我按下一个键时,它会说:
Entering the test() function.
……就是这样。程序退出(当然)并且没有时间进入下一个WriteLine()
.
我觉得这种行为很神秘。这很容易解决,但我对它为什么会发生很感兴趣。
[编辑]
如果我在它按预期工作Thread.Sleep(1)
之前立即添加。Console.ReadKey()
当然,这不应该是必要的,因为Console.ReadKey()
无论如何都应该永远等待。
所以看起来它可能是某种竞争条件?
更多信息:Servy 发现(并且我已经复制)该线路Console.WriteLine("Entering the test() function.")
被阻塞,直到按下任何键。
构建配置
Visual Studio 2012,Windows 7 x64,四核,英语(英国)。
我已经尝试了 .Net4、.Net4.5、x86、AnyCPU 以及调试和发布的所有组合,但它们都不能在我的 PC 上运行。但是发生了一件非常奇怪的事情。当我第一次尝试 .Net4 的 AnyCPU 版本时它开始工作,但随后又停止工作。看起来很像只影响某些系统的竞争条件。