我需要手动处理TraceListener吗?

时间:2018-10-20 15:40:04

标签: c# logging garbage-collection trace

很抱歉,如果我在某个地方错过它,但是如果框架自动处置了TraceListener,我找不到任何文档。

如果我使用此代码:

        var traceListener = new DailyTraceListener("Logs", true);
        Trace.Listeners.Add(traceListener);

假设需要调用traceListener.Dispose()使其正常工作,我是否需要手动调用Dispose?请注意,如果Dispose第二次被调用,则实现将引发错误(我正在尝试对其进行更改)。

this article中:

  

TraceSource处理监听器

在这种情况下,TraceSource在哪里?它会自动处置吗?

简而言之,程序退出时是否保证Dispose被.NET调用?

1 个答案:

答案 0 :(得分:0)

我自己做了测试。似乎从来没有自然地调用过它。这是演示代码:

class Program
{
    static void Main(string[] args)
    {
        var listener = new TestTraceListener();
        Trace.Listeners.Add(listener);
        Trace.WriteLine("Test");
        listener.Dispose();
        Trace.WriteLine("After dispose");
    }
}

public class TestTraceListener : TraceListener
{
    public override void Write(string message)
    {
        File.AppendAllText("log.log", message);
    }

    public override void WriteLine(string message)
    {
        this.Write(message + Environment.NewLine);
    }

    protected override void Dispose(bool disposing)
    {
        this.WriteLine("Dispose called");
        base.Dispose(disposing);
    }

    ~TestTraceListener()
    {
        this.WriteLine("Destructor called");
    }

}

我的文本文件是:

  

测试

     

处置被叫

     

处理后

之后,我尝试删除Dispose调用(// listener.Dispose();),结果如下:

  

测试

     

处理后

结论:如果程序自然退出,则默认情况下不会调用Dispose