多线程应用程序中的C#TraceSource类

时间:2009-12-15 17:05:40

标签: c# multithreading tracing

msdn:“此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的。不保证所有实例成员都是线程安全的。”它只包含实例方法。

我应该如何使用TextWriterTraceListener将所有活动记录到文本文件中的方式。是一个静态成员,所有线程使用(通过调用)TraceEvent方法安全。

(我在how to instantiate C# TraceSources to log (multithreaded) ASP.NET 2.0 Web application (asmx ws)?中有点问过这个问题,但我不能只相信有人只是说尽管有文档就行了。)

2 个答案:

答案 0 :(得分:7)

TraceSource类是线程安全的。见http://msdn.microsoft.com/en-us/library/system.diagnostics.tracesource.aspx

我相信之前它没有被列为线程安全但这是一个文档错误。

答案 1 :(得分:0)

在多线程应用程序中使用非线程安全(或不保证线程安全)的资源时,我将使用lock关键字

lock( _lockObject)
{
  // do my non-thread-safe-operations here
}

可以在此处找到lock关键字的文档/示例:

http://msdn.microsoft.com/en-us/library/c5kehkcz(VS.71).aspx

对于使用类的公共静态实例的所有线程 - 这不一定是线程安全的。使用静态实例可确保对象的状态在线程之间共享/一致,但不一定会阻止对该方法的并行调用。实际上,如果实例方法在静态对象中使用了一些常见的状态变量 - 从多个线程访问对象可能会引入其他问题 - 竞争条件,尝试访问同一资源的多个线程等。静态实例对象并不妨碍这些条件。

如果您正在使用该对象的静态实例,请在对其进行操作时锁定它并且您应该没问题。