【问题标题】:Writing to console in c#: can you single writeline with multiple colors, or lock the console to do multiple writes?在 C# 中写入控制台:您可以使用多种颜色单写行,还是锁定控制台以进行多次写入?
【发布时间】:2013-09-19 13:45:25
【问题描述】:

我想将一个具有多种颜色的字符串放在控制台上,让它像单个 WriteLine 一样执行,而不是多个写入可能会被同时写入的其他线程中断或损坏。

所以下面的帖子看起来是朝着正确的方向发展,但我无法控制写入控制台的所有代码。我的代码仅限于我正在创作的 dll,所以我不能随便把锁放在任何可能干扰的地方。如果这是一个关于锁和对线程的理解的问题,那是毫无疑问的。如果没有锁定我的代码,这是否可能?

How do I lock the console across threads in C#.NET?

【问题讨论】:

  • 有多少线程将写入控制台?您在代码中有多少个位置有 WriteLine 调用。 ?
  • 我想我在没有锁的情况下运行得很好......但我知道事情可能会出错,这让我很烦恼。 ...但我们不知道将向控制台写入什么代码,而且我不能告诉其他开发人员“嘿,这样做时使用这个锁”(我宁愿让它在蓝月亮中出现错误) .但是,来自其他代码的消息分配似乎不太可能出现在控制台上,我无法控制。
  • 我只有一行要写。诚然,它会经常受到打击,因为它是一个类似于我链接到的另一篇文章中的记录器行。
  • 那么锁就够了。或者,如果您想要一个无锁 impl 使用 Queue 并有一个线程池线程,该线程调度队列数据并写入控制台,然后在队列为空时退出,再次执行相同操作\
  • @Sriram Sakthivel 嗯,其他线程(我的 dll 之外的父进程)如何知道锁?

标签: c# multithreading windows-console console.writeline


【解决方案1】:

使用 Console.SetOut 将现有的输出流替换为您自己的 TextWriter。在您的自定义文本编写器中,让它同步对某个对象上的控制台的访问,然后写回 real 标准输出,并为您还必须能够执行的辅助方法提供一些方法在同一个对象上同步,这样每当该辅助方法运行时,它就可以锁定应用程序其余部分对控制台的访问。

【讨论】:

  • 嗯,请详细说明“在某些对象上同步访问控制台”。
  • @amalgamate 您使用lock 关键字,并在对Write 的所有调用中传入单个对象实例。您的问题给人的印象是您熟悉基本的线程间同步。
  • 嗯。但其他代码正在写入控制台。代码我不拥有,也不控制。我无法将所有写入事件锁定到控制台。我可以锁定我创建的这个 textWriter,但这有什么好处呢?它如何涉及/参与控制台并允许我在一行中使用多种颜色?
  • @amalgamate 正如我在回答中所说,您将用自己的输出流替换控制台的输出流,这意味着对Console.Write 的所有调用都将发送到您的文本编写器。这就是这个答案的症结所在。
  • 好的,所以我开始看到......但可以肯定的是,也调用 Console.ForegroundColor?哇,如果是这样,谢谢。
猜你喜欢
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-10
相关资源
最近更新 更多