C# 为什么线程池线程不';除非先打印主线程,否则不要将任何内容打印到控制台

C# 为什么线程池线程不';除非先打印主线程,否则不要将任何内容打印到控制台,c#,.net,multithreading,C#,.net,Multithreading,我对下面的代码片段感到非常困惑 //Console.WriteLine("Main thread: Doing other work here..."); ThreadPool.QueueUserWorkItem( state => { for (int i = 0; i < 10; i++) { Thread.Sl

我对下面的代码片段感到非常困惑

 //Console.WriteLine("Main thread: Doing other work here...");
        ThreadPool.QueueUserWorkItem(
            state =>
            {
                for (int i = 0; i < 10; i++)
                {
                    Thread.Sleep(200);
                    Console.WriteLine("In computeBoundOp: state={0} " + i, state);
                }
            }, 5);
 //Console.WriteLine("Hit <Enter> to end this program...");
 Console.ReadKey();
//Console.WriteLine(“主线程:在这里做其他工作…”);
ThreadPool.QueueUserWorkItem(
状态=>
{
对于(int i=0;i<10;i++)
{
睡眠(200);
WriteLine(“在computeBoundOp:state={0}”+i,state);
}
}, 5);
//WriteLine(“点击以结束此程序…”);
Console.ReadKey();
实际上,线程池线程不会打印任何内容,除非我在线程池部分之前或之后取消对“Console.WriteLine()”的注释。(注意,我甚至在主线程的末尾有一个readkey)

或者,为了让背景线程打印一些东西,我必须使用manualresethandle让主线程等待线程完成

你知道这是怎么发生的吗

谢谢。

ReadKey()锁定Console.InternalSyncObject并在写入等待时阻止等待输入。有关更多信息,请参阅

这会在Console.WriteLine()写入时和Console.ReadKey()读取前产生一个竞争条件,这解释了为什么注释中的人认为它在他们的机器上工作正常(而我没有)

将另一个Console.ReadKey()放在首字母后面。按下按钮并继续。然后,您将得到您最初期望的结果

使用类似于:

ConsoleKeyInfo cki = null;
do
{
    if (Console.IsKeyAvailable)
        cki = Console.ReadKey(); 
} while(true);

。。。不阻塞。

它在我的笔记本电脑上工作,在我的机器上也工作。谢谢。用这个块替换“Readkey”(需要一些小的修改),它就工作了。