gpt4 book ai didi

c# - Trace.WriteLine 线程安全吗?

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

我有一个多线程程序,我想为其使用 Trace.WriteLine,并将输出重定向到一个文本文件:

_LogTracer = new System.Diagnostics.TextWriterTraceListener(logPath);   
Trace.AutoFlush = true;
Trace.Listeners.Add(_LogTracer);

这足以保证线程安全吗?如果两个线程试图同时写入输出文件怎么办?

最佳答案

{写。整体线程安全

使用 Trace.Listeners.Add (或 Remove )对于 Trace.Write 而言不是线程安全的(或 WriteLine )当 Trace.UseGlobalLock 时被明确禁用。

Write 的线程安全性 - 或缺乏 -仅应用单个跟踪监听器类型(如前所述,TextWriterTraceListener 实现是线程安全的)或通过全局跟踪锁保护(有关讨论,请参阅 TraceListener.IsThreadSafe )。

我有一些糟糕的旧代码修改了 Listener 集合,这可能会导致多线程环境中的错误:

[System.InvalidOperationException]
Collection was modified; enumeration operation may not execute.
-------------------------------------------------- -- >
at System.Collections.ArrayList.ArrayListEnumeratorSimple.MoveNext()
at System.Diagnostics.TraceInternal.WriteLine(String message, String category)

文档说 Listeners是线程安全的并且有点误导:Listeners.GetEnumerator 没有像提示的那样建立复制锁定。线程安全锁仅通过几个单独的添加/删除方法获取。

制作Trace.Write关于修改的线程安全Listeners需要使用 Trace.UseGlobalLock 这将获得对枚举和写入所有 监听器的锁定。

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

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