2011-04-06 56 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」]關閉()

相關問題