从多个线程调用 Console.WriteLine
Posted
技术标签:
【中文标题】从多个线程调用 Console.WriteLine【英文标题】:Calling Console.WriteLine from multiple threads 【发布时间】:2009-07-03 16:05:15 【问题描述】:为什么 Console.WriteLine 可以在多个线程中工作?
【问题讨论】:
为什么不应该呢? @balpha - 问题是它为什么起作用,它起作用的原因是什么。没有什么说它不起作用。你的评论是讽刺和冒犯的。 对不起,这不是故意的。它说的是:你问这个问题的事实表明你认为它确实有效是一个惊喜。我真的很想知道为什么,因为我对多线程及其注意事项一无所知。如果听起来粗鲁,请道歉。 【参考方案1】:控制台类为您处理线程同步。
来自Console的文档:
使用这些流的 I/O 操作是 同步,这意味着多个 线程可以读取或写入, 流。
【讨论】:
@Reed 是通过锁定同步还是与其他同步机制同步? @Lirik 它是在本机端处理的,而不是使用托管锁。 我想补充一点,控制台窗口(在 Visual Studio 中)允许从多个线程写入文本,但您应该注意,输出文本的顺序可能与预期不同,例如添加大字符串(如堆栈跟踪)时,它们甚至可能最终出现“乱码”或混合。显然没有锁定可以确保在另一个调用开始将文本泵入流中之前完成一个Write
。
我想知道,文本需要多长时间才能体验到乱码?我尝试了两个类似的程序,一个在 C++ 中使用 cout
,另一个在 C# 中使用 Parallel.For
和 Console.Write
。虽然 C++ 程序确实提供了来自不同线程的混合输出,但 C# 程序显示了正确的输出,我找不到任何方法来破坏它。【参考方案2】:
.NET 4.5 CLR 中存在一个错误,如果您使用 Console.ReadKey,Console.WriteLine 不能在多个线程中工作。它在某些 Windows 版本中已修复,但在 8.1 Windows 更新中尚未找到它。
Infrequent hangs in a multi-threaded C# console application when using Console.Writeline() or Console.Write()
Using Console.WriteLine in a Timer why it would appear to exit?
【讨论】:
【参考方案3】:使用Console.WriteLine
时,多个线程写入相同的输出,通常是默认情况下您的屏幕。
【讨论】:
那么 Console.WriteLine 被编码为线程安全了吗?一个线程阻塞而另一个写入? 它是 - 请参阅我的答案以了解 MSDN 的详细信息。【参考方案4】:控制台和您的代码是 2 个独立的应用程序
控制台窗口不是您的应用程序。控制台应用程序是不可见的,您的应用程序不包含控制台。控制台安装在 Windows 本身中。
Console.Writeline() 是一条消息
它写入一个 TextStream。 Microsoft 的控制台进程只是等待显示新的流文本。
“控制台应用程序”名称不会使其成为控制台
与 ui 项目的不同之处在于控制台应用程序带有一组简化的引用,并且依赖于输入/输出流与用户进行通信。
您甚至不需要控制台,您可以构建自己的控制台,或者使用调试器来查看和写入。
与记事本比较
如果文件是一条消息,并且记事本打开了您的代码保存的文件流。从哪个线程保存文件并不重要。您没有访问任何用户界面。
【讨论】:
以上是关于从多个线程调用 Console.WriteLine的主要内容,如果未能解决你的问题,请参考以下文章
使用 Console.Writeline() 或 Console.Write() 时,多线程 C# 控制台应用程序中不经常挂起