使用多线程调用Console.WriteLine函数

60

为什么Console.WriteLine可以在多个线程中工作?


14
为什么不呢? - balpha
24
问题是“它为什么有效”,“它有效的原因是什么”。没有任何内容表明它无效。你的评论讽刺而冒犯。 - user113476
21
抱歉,这不是我的本意。它的意思是:你问这个问题其实表明了你认为它能正常工作是很令人惊讶的。我真的很想知道为什么,因为我对多线程及其注意事项几乎一无所知。如果听起来很无礼,请原谅。 - balpha
4个回答

77

控制台类为你处理线程同步。

控制台的文档中得知:

使用这些流进行I/O操作是同步的,这意味着多个线程可以从流中读取或写入数据。


3
@Lirik 这是在本地端处理的,不使用托管锁。 - Reed Copsey
4
我想补充一点,在Visual Studio中,控制台窗口允许从多个线程写入文本,但是需要注意的是输出文本的顺序可能不如预期,例如在添加大字符串(例如堆栈跟踪)时,它们甚至可能变得“混乱”或混合。显然没有锁定来确保一个Write完成后再开始另一个调用将文本传输到流中。 - mike
我在想,文本需要多长才能出现乱码?我尝试了两个类似的程序,一个是用C++编写的,使用了cout,另一个是用C#编写的,使用了Parallel.ForConsole.Write。虽然C++程序确实从不同的线程中输出了混合的结果,但C#程序显示了正确的输出,我找不到任何破坏它的方法。 - JustAMartin
@mike,您的意思是多个线程调用Console.WriteLine的顺序与文本在控制台中出现的顺序不同吗?换句话说,Console.WriteLine是异步写入的,而不是按照调用顺序写入的吗? - WriteEatSleepRepeat
@WriteEatSleepRepeat:这不适用于WriteLine - mike
显示剩余2条评论

11

2

当使用Console.WriteLine时,多个线程会写入相同的输出,通常是默认情况下的屏幕。


所以 Console.WriteLine 是编码为线程安全的吗?一个线程阻塞,而另一个线程写入? - user113476
请查看我从MSDN中提供的详细答复。 - Reed Copsey

0

控制台和您的代码是两个独立的应用程序

控制台窗口不是您的应用程序。控制台应用程序是不可见的,您的应用程序不包含控制台。控制台安装在Windows本身中。

Console.Writeline()是一条消息

它写入一个TextStream。Microsoft的控制台进程只是等待新的流文本以显示。

'控制台应用程序'名称并不意味着它是控制台

与UI项目的区别在于,控制台应用程序带有简化的引用集,并依赖于输入/输出流来与用户通信。

您甚至不需要控制台,您可以构建自己的控制台,或使用调试器查看和写入它。

与记事本的比较

如果文件是一条消息,并且记事本打开了由您的代码保存的文件流。无论从哪个线程保存文件都没有关系。您没有访问任何UI。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接