我有事至极看起来对我来说比赛条件,同时记录到文件,从 多个线程。

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,derved类 _听众。基本上只有控制台和文本文件的听众。 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的同步方法返回-safe包装。这也适用于像的StreamWriter和StreamReader的类“。

在那之后我不断收到对同一呼叫第二个例外很多次,

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

异常

计数不能小于零。 参数名:计数 堆栈跟踪:“在System.String.CopyTo(的Int32 sourceIndex,CHAR []目的地,的Int32 destinationIndex,的Int32计数)\ r \ n在System.IO.StreamWriter.Write(字符串值)\ r \ n在System.Diagnostics程序。 TextWriterTraceListener.Write(字符串消息)\ r \ n在System.Diagnostics.TraceListener.WriteHeader(字符串源,TraceEventType EVENTTYPE,的Int32 ID)\ r \ n在System.Diagnostics.TraceListener.TraceData(TraceEventCache eventCache,字符串源,TraceEventType EVENTTYPE ,的Int32 ID,对象数据)\ r \ n在Jfc.Configuration.ConfigurableTraceLogger.TraceData(字符串类别,TraceEventType类型,事件ID编号,字符串前缀,字符串格式,对象[]参数)“

在我看来,我的类不是线程安全的,以及调用TRACEDATA。但ConfigurableTextWriterTraceListener据说线程毕竟安全。但是我检查IsThreadSafe欢迎使用属性为我TextWriterTraceListener会派生类在运行时 而且假的。我试图找出问题的所在。

有帮助吗?

解决方案

这意味着什么说 - 从多个线程访问,当你的TraceListener不是线程安全和休息。你需要让你的听众是线程安全的或找到一种方法,以确保只有一个线程访问任何特定实例。

,使他们线程安全的一种方法是使用一个同步的队列,让您的来电排队的数据项的队列中,而“真实”的TraceListener队列中取出它们,在一个单独的线程写出来。

您还必须小心你的听众的字典 - 更新字典是不是线程安全的,但应用的最后更新之前,如果你从来没有访问它,你可以把它看作是

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top