- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在从多线程。
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/
我正在创建一个这样的跟踪监听器: // Setup log tracing. Trace.Listeners.Add(new TextWriterTraceListener(MyLogPath));
我在从多线程。 1) 我有一个自定义记录器类 (ConfigurableTraceLogger),它由我的应用程序中的多个线程共享。它有很多包装函数,这些函数都调用了主要的核心函数 protected
我正在使用 TextWriterTraceListener 将我的跟踪信息输出到日志文件。不幸的是,它锁定了日志文件,我无法在应用程序运行时从外部打开它。有什么办法可以做到这一点? 最佳答案 这取决于
配置文件: 代码: static void Main(string[] args)
我正在使用 C# System.Diagnostics.TextWriterTraceListener 打印跟踪。但是跟踪文件变得太大(数百 MB)。我想更改 TextWriterTraceListe
我在我的应用程序中使用 TextWriterTraceListener,如果文件不可用于写入跟踪,它会创建另一个带有 GUID 前缀的跟踪文件。 我感兴趣的是获取跟踪文件名。在正常情况下,我知道文件名
我正在尝试决定是使用 TextWriterTraceListener 还是 StreamWriter 来写入日志文件。在我工作的公司中,有些人使用其中一种,有些人使用另一种,但没有人能给我解释两者之间
我在应用程序中使用 TextWriterTraceListener (System.Diagnostics) 来跟踪异常等多项内容,... 应用程序在终端服务器上运行,如果有许多用户同时使用它,则监听
我正在尝试决定是使用 TextWriterTraceListener 还是 StreamWriter 来写入日志文件。在我工作的公司中,有些人使用其中一种,有些人使用另一种,但没有人能给我解释两者之间
所以我使用 Tracesource 来记录一些错误并且不想在用户本地 Windows 文档结构中创建日志文件(类似于 System.Environment.SpecialFolder.LocalApp
我在我的应用程序中使用 TextWriterTraceListener (System.Diagnostics) 来跟踪一些事情,例如异常,...... 该应用程序在终端服务器上运行,如果有许多用户同
我在 app.config 中有以下监听器: 我的要求是,从代码后面访问监听器对象并动态
我看到了两个关于这个主题的答案,但我想不通。我有一个自定义的 TextWriterTraceListener,我希望它在我的跟踪源中使用。 namespace MyTraceLogger { p
我正在使用 System.Diagnostics.TraceSource 进行日志记录,我的监听器之一是 TextWriterTraceListener。在示踪底漆here它设置如下: 问题
我查看了 TextWriterTraceListener 类的属性及其父类,但没有看到向 app.config 添加属性的方法,以便在 TraceWriter 打开文件。 最佳答案 清除 appdom
我是一名优秀的程序员,十分优秀!