【问题标题】:Why ThreadPool thread doesn't print anything to console unless main thread print first为什么除非主线程先打印,否则 ThreadPool 线程不会向控制台打印任何内容
【发布时间】:2013-05-23 12:38:20
【问题描述】:

我对下面的代码 sn-p 感到很困惑。

 //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()”。(请注意,我什至在主线程末尾有一个 readkey)

否则,要让后台线程打印一些东西,我必须使用手动重置句柄让主线程等待线程完成。

知道这是怎么发生的吗?

谢谢。

【问题讨论】:

  • 它适用于我的笔记本电脑
  • 它也适用于我的机器。

标签: c# .net multithreading


【解决方案1】:

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

这会在 Console.WriteLine() 写入和 Console.ReadKey() 读取之前产生竞争条件,这解释了为什么 cmets 中的人认为它在他们的机器上运行良好(而我没有)。

在初始之后放置另一个 Console.ReadKey()。按一个按钮并继续。然后,您将得到您最初期望的结果。

使用类似的东西:

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

...不阻止。

【讨论】:

  • 谢谢。用这个块替换“Readkey”(虽然需要一些小的修改),它可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
  • 2011-08-06
相关资源
最近更新 更多