我对下面的代码片段感到非常困惑。
//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/