gpt4 book ai didi

c# - Console.SetError 是线程安全的吗?

转载 作者:太空宇宙 更新时间:2023-11-03 10:41:18 25 4
gpt4 key购买 nike

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

背景:我有一个可以连续运行数天的程序,它会将大量日志输出到文件中,我希望每天都有一个单独的日志文件,这样我就可以偶尔删除最旧的文件。最简单的方法是,我想,只需按分钟间隔检查一天是否已经过去,如果已经过去,只需创建一个新文件并将流分配给错误输出。我尝试在系统有一段时间不活动时执行此操作,但没有其他花哨的检查,因此 可能 发生交换发生时它正在写入(旧)流。(我不在乎输出线是否一分为二,但会介意崩溃,呵呵)

MSDN 提到 Console 的“I/O 操作是线程安全的”,但是在我的书中调用 SetError 不是 IO 操作,并且 SetError 的 MSDN 页面没有提到这一点。

最佳答案

大概在整个程序中,您会在不同的地方做类似这样的事情:

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

关于c# - Console.SetError 是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25269033/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com