使用时,我发现了一个奇怪的问题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的64位,四核,英语(英国)。
我试过.NET4,.Net4.5,X86,AnyCPU和调试的所有组合和释放,他们都不在我的电脑上工作。 但是一个非常奇怪的事情发生了。 它开始工作时,我第一次尝试为.NET4的AnyCPU版本,但随后停止工作了。 看起来非常像只影响一些系统的竞争条件。