c# - 为什么 ThreadPool 线程不打印任何内容到控制台,除非主线程先打印

标签 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()”,否则线程池线程不会打印任何内容。(注意,我什至在主线程末尾有一个 readkey)

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

知道这是怎么发生的吗?

谢谢。

最佳答案

ReadKey() 锁定 Console.InternalSyncObject 并在写入等待时阻止等待输入。请参阅here获取一些附加信息。

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

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

使用类似:

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

...不阻止。

关于c# - 为什么 ThreadPool 线程不打印任何内容到控制台,除非主线程先打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16705313/

相关文章:

C#:事件处理程序如何绑定(bind)到名为 "On....."的方法?

css - 没有 Ruby 的 SASS for .NET 应用程序

C - accept() 接受同一个客户两次?

c - `pthread_mutex_lock` 和 `pthread_cond_wait` 是否在同一个队列中等待?

时间:2019-03-17 标签:c#opennetcfRegistryHelper.SaveHiveBasedKey

c# - 让方法在 c# 中采用任何数据类型

c# - 高级 : How to optimize my complex O(n²) algorithm

java - 什么时候并行执行任务是一种矫枉过正的行为?

c# - 如何在 Unity TileSystem 中停止平铺动画?

c# - 用 3 位数字分隔长号