除非首先打印主线程,否则为什么ThreadPool线程不会向控制台打印任何内容

时间:2013-05-23 03:44:58

标签: c# .net multithreading

我对下面的代码段非常困惑。

 //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();

实际上线程池线程不打印任何东西,除非我在ThreadPool部分之前或之后取消注释“Console.WriteLine()”之一。(注意我在主线程结束时甚至有一个读取密钥)

或者,为了让后台线程打印出来,我必须使用manualresethandle让主线程等待线程完成。

知道这是怎么发生的吗?

感谢。

1 个答案:

答案 0 :(得分:2)

ReadKey()锁定Console.InternalSyncObject并在写入等待时阻塞等待输入。有关其他信息,请参阅here

这会在Console.WriteLine()写入和Console.ReadKey()读取之间产生竞争条件,这解释了为什么评论中的那些人认为它在他们的机器上工作正常(我没有)。

在初始化之后放置另一个Console.ReadKey()。按下按钮继续。然后你会得到你最初期待的东西。

使用类似:

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

......不要阻止。