gpt4 book ai didi

c# - 竞争条件/TextWriterTraceListener

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

我在从多线程。

1) 我有一个自定义记录器类 (ConfigurableTraceLogger),它由我的应用程序中的多个线程共享。它有很多包装函数,这些函数都调用了主要的核心函数

protected void TraceData(String category, TraceEventType type, EventId id, string prefix, string format)
{
foreach (TraceListener item in _listeners)
{
IConfigurableTraceListener cl = item as IConfigurableTraceListener;

if (cl != null && cl.Category == category.ToLower())
{

if (DisplayMethodName)
item.TraceData(new TraceEventCache(), _instanceName, type, (int)id, prefix + format);
else
item.TraceData(new TraceEventCache(), _instanceName, type, (int)id, format);

item.Flush();
}
}
}

如您所见,我的类只是将不同的 TraceListner 派生类存储在一个集合中_听众。基本上只有控制台和文本文件监听器。 TraceData 的作用是获取类别名称(即日志记录启动)并找到正确的监听器。所有监听器都由配置文件名定义

现在我在集合中也有我的自定义监听器

public class ConfigurableTextWriterTraceListener : TextWriterTraceListener, IConfigurableTraceListener

除了一个属性外,该自定义类不覆盖任何内容。

protected override string[] GetSupportedAttributes()
{
return new string[] { "category" };
}

当我在 5 到 10 分钟后启动我的应用程序时,出现异常在通话中

           item.TraceData(new TraceEventCache(), _instanceName, type, (int)id, prefix + format);

异常是说:

“复制内存时检测到可能的 I/O 竞争条件。默认情况下,I/O 包不是线程安全的。在多线程应用程序中,必须以线程安全的方式访问流,例如线程-由 TextReader 或 TextWriter 的 Synchronized 方法返回的安全包装器。这也适用于 StreamWriter 和 StreamReader 等类。”

在那之后,我在同一个调用中多次收到第二个异常

item.TraceData(new TraceEventCache(), _instanceName, type, (int)id, prefix + format);

异常

计数不能小于零。参数名称:计数堆栈跟踪:“在 System.String.CopyTo(Int32 sourceIndex, Char[] destination, Int32 destinationIndex, Int32 count)\r\n 在 System.IO.StreamWriter.Write(String value)\r\n 在 System.Diagnostics。 TextWriterTraceListener.Write(字符串消息)\r\n 在 System.Diagnostics.TraceListener.WriteHeader(字符串源,TraceEventType 事件类型,Int32 id)\r\n 在 System.Diagnostics.TraceListener.TraceData(TraceEventCache eventCache,字符串源,TraceEventType 事件类型, Int32 id, Object data)\r\n at Jfc.Configuration.ConfigurableTraceLogger.TraceData(String category, TraceEventType type, EventId id, String prefix, String format, Object[] args)”

在我看来,我的类以及对 TraceData 的调用都不是线程安全的。但是 ConfigurableTextWriterTraceListener 毕竟据说是线程安全的。但是我在运行时检查了我的 TextWriterTraceListener 派生类的 IsThreadSafe 属性这是错误的。我正在尝试找出问题所在。

最佳答案

意思就是说 - 您的 TraceListener 不是线程安全的,并且在从多个线程访问时会中断。您需要使监听器线程安全或找到一种方法来确保只有一个线程访问任何特定实例。

使它们线程安全的一种方法是使用同步队列并使所有调用将数据项排入队列,而“真正的”traceListener 将它们从队列中取出并在单独的线程中将它们写出。

你还必须小心你的监听器字典 - 更新字典不是线程安全的,但如果你在应用最后一次更新之前从未访问过它,你可以保持原样

关于c# - 竞争条件/TextWriterTraceListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1701821/

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