Console.SetError是线程安全的吗?

时间:2014-08-12 16:04:36

标签: c# .net

一个正在运行的程序的Inmidst,它有多个调用Console.Write的线程,我可以调用Console.SetError来设置一个新的流吗?即这是线程安全的吗?

背景: 我有一个程序将连续运行数天,它会有相当数量的日志输出到文件,我希望每天有一个单独的日志文件,所以我可以删除最旧的文件一次而。最简单的方法是,我想,只需检查一天是否已经过去,如果是这样,只需创建一个新文件&将流分配给错误输出。我尝试在系统处于非活动状态一段时间时执行此操作,但没有其他花哨的检查,因此当交换时,可能发生在写入(旧)流的过程中发生。 (我不在乎输出线被分成两部分,但是会介意崩溃,呵呵)

MSDN提到控制台的I / O操作是线程安全的#34;但是在我的书中调用SetError不是IO操作,并且SetError的MSDN页面没有提到此

2 个答案:

答案 0 :(得分:2)

大概在整个程序中,你会有各种各样的地方,你可以做这样的事情:

catch (Exception e)
{
    Console.Error.WriteLine(e);
}

Talking about whether something is thread safe isn't really meaningful because it means radically different things to different people and in different contexts.

只谈论代码中可能发生和不会发生的事情会更有效。

  • 传递给Console.Error.WriteLine的字符串将写入某些流。没有办法让错误信息“掉在地上”而不是写在任何地方。

  • 传递给WriteLine的调用的字符串不会部分写入一个流,而是部分写入另一个流。整个字符串将写入某些流,我们不一定知道哪一个呼叫与调用SetError的时间大致相同。这是因为Console.Error首先被评估为引用,然后该引用被告知写出一个字符串。将变量Console.Error更改为引用另一个对象不会影响您已经引用的作者。

  • 更改后,可以将字符串写入“旧”流。当调用者已将Console.Error评估为该变量的值(对文本编写器的引用)但尚未实际写入该文件时,会发生这种情况。

  • 代码也完全有可能获取对Console.Error的引用,保留它并继续写入它。如果在您的应用程序中发生这种情况而不是在每次需要错误流时不断评估Console.Error那么可能会继续使用旧文件,可能在您调用SetError并更改错误后很长时间流。

  • Console.Error.WriteLine的多次调用最终会出现在多个文件中。如果消息不跨越多个文件很重要,则不需要多次评估Console.Error

答案 1 :(得分:0)

从这个链接 - http://msdn.microsoft.com/en-us/library/system.console%28v=VS.100%29.aspx - ,你有答案。你要问的是一个小小的代码:

  

默认情况下,In属性的值是System.IO.TextReader   对象,以及Out和Error属性的值   System.IO.TextWriter对象。但是,您可以将这些属性设置为   不代表控制台的流;例如,你可以设置   这些属性表示代表文件的流。重定向   标准输入,标准输出或标准错误流,调用   分别为SetIn,SetOut或SetError方法。使用I / O操作   这些流是同步的,这意味着多个线程可以读取   来自或写入溪流。

相关问题