【问题标题】:TraceSource across threads doesn't work?TraceSource 跨线程不起作用?
【发布时间】:2012-01-28 20:18:17
【问题描述】:

伙计们,我想我已经失去理智了。根据 MSDN,TraceSource 是线程安全的。所以我有一个简单的控制台应用程序。我在其中声明;

private static readonly TraceSource ActiveTraceSource = new TraceSource("Test");

在我的 app.config 中,我有;

<system.diagnostics>
    <trace autoflush="true">
      <listeners>
        <add name="consoleListener" type="System.Diagnostics.ConsoleTraceListener"/>
      </listeners>
    </trace>
  </system.diagnostics>

在我的 main() 中,我做了类似的事情;

ActiveTraceSource.TraceInformation("Hi!");

效果很好,我有你好!在我的控制台上。然后我这样做;

new Thread(DoWork).Start();

在 DoWork 内部,我做同样的事情;

ActiveTraceSource.TraceInformation("Hi!");

应该工作,但我没有得到第二个“嗨!”。设置断点显示 DoWork 有一个 ActiveTraceSource 实例,并且集合中有一个侦听器,但控制台中没有。

这是控制台侦听器中的错误吗?我错过了什么吗?

【问题讨论】:

  • 我添加了一个TextWriterListener,看看它是否只是控制台——同样的效果,它不写。

标签: c# c#-4.0 system.diagnostics


【解决方案1】:

我使用了以下配置。

<system.diagnostics>
    <sources>
      <source name="Test" switchValue="All">
        <listeners>
          <add name="consoleListener" type="System.Diagnostics.ConsoleTraceListener"/>
        </listeners>
      </source>
    </sources>    
  </system.diagnostics>

测试代码:

class Program
        {
        private static readonly TraceSource ActiveTraceSource = new TraceSource("Test"); 
        static void Main(string[] args)
            {

            ActiveTraceSource.TraceInformation("Hi");
            Thread th = new Thread(new ThreadStart(Test));
            th.Start();
            Console.ReadLine();
            }

        static void Test()
            {
            ActiveTraceSource.TraceInformation("Hi");
            }
        }

它在线程中也适用于我。

【讨论】:

    【解决方案2】:

    愚蠢和愚蠢一样......当使用跟踪源时,确实有助于包含配置的部分......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多