2011-04-06 33 views
2

我已经编写了一个扩展TextWriterTraceListener的自定义跟踪侦听器。如何调用c#中的自定义跟踪侦听器的配置#

现在,我如何在侦听器上调用Dispose()?我通过我的项目的app.config添加它。

尝试添加调用在终结器中Dispose(false),但它没有被调用。奇怪的是,它在VS 2010中被调用,但不是在运行应用程序时,但我知道GC集合不能保证。 (基本上这是用于nunit测试来记录来自测试的System.Net.Socket调用,并且在所有测试运行之后我需要做一些后处理,并将它写入日志中。我将这部分添加到了Dispose( ))

的App.config片段:

<sources> 
    <source name="System.Net.Sockets" tracemode="protocolonly" maxdatasize="10240"> 
    <listeners> 
     <add name="CustomTraceListener" type="Tests.Custom.MyTest.CustomTraceListener, Tests.Custom.MyTest" initializeData="custom.log" /> 
    </listeners> 
    </source> 
</sources> 

一些代码片段:

~CustomTraceListener() 
    { 
     Dispose(false); 
    } 

    protected override void Dispose (bool disposing) 
    { 
     base.Write(customProcessor.PostProcess()); 
     base.Flush(); 
     base.Dispose(disposing); 
    } 

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

回答

1

我不得不编写一个SetUpFixture,并且在TearDown中,使用一些反射从程序集中获取类型“System.Diagnostics.TraceSource”,得到一个私有静态字段,它是所有跟踪源的列表,并称为Dispose()在我的自定义侦听器上。

FieldInfo[] info = ts.GetType().Assembly.GetType("System.Diagnostics.TraceSource").GetFields(BindingFlags.NonPublic | BindingFlags.Static); 

调用Dispose()上TraceSource

foreach (TraceListener listener in s.Listeners) 
       { 
        listener.Dispose(); 
        Console.WriteLine("disposing"); 
       } 
0

无论你的方法的名称会是这样,你必须明确地调用它自己。从终结器中进行任何有意义的处理都非常困难,因为当GC破坏收集到的对象并且它没有按照任何特定的顺序执行时,这意味着你不能依赖任何你可能想要在终结器中处理的对象仍然活着。

+0

我并不想这样做的终结。那是我的问题,我怎么称呼Dispose()?或者我该如何做一些“后期处理”?这不像我有一个主要方法添加跟踪监听器,然后我可以调用Dispose()或Close()。我怎么做一个“使用”我在App.config中提到的东西。 – manojlds 2011-04-06 18:39:55

1

另一种方式,所有的听众要做到这一点,而不反思:

你的地方定义tracesource,大概是这个样子:

private static readonly TraceSource trace = 
     new TraceSource("System.Net.Sockets"); 

现在,你仍然需要拆解,或者最后被调用的东西。 外的单元测试,你可以捕捉AppDomain.ProcessExit, AppDomain.UnhandledException或Window.Close

如果您没有访问您的拆卸traceSource,你可以只再次new TraceSource("System.Net.Sockets");声明或使用另一TraceSource使用相同的共享侦听器在App.config中定义。

现在你有3种可能性:

  1. 你可以调用trace.Close()。 这将调用.Close()收听到TraceSource所有traceListeners,包括您的特殊听众

  2. 您可以通过trace.Listeners迭代和检查,发现你的听众类型。

  3. ,你可以参考你的听众的名字:trace.Listeners [“CustomTraceListener”]关闭()

相关问题