首页 > 解决方案 > 我需要手动处理 TraceListener 吗?

问题描述

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

如果我使用此代码:

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

我是否需要手动调用traceListener.Dispose(),假设Dispose应该调用它才能正常工作?请注意,如果Dispose第二次调用该实现将引发错误(我正在尝试更改它)。

这篇文章中

侦听器由 TraceSource 处理

TraceSource在这种情况下是什么/在哪里?会自动处理吗?

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

标签: c#logginggarbage-collectiontrace

解决方案


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

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如果程序自然退出,默认不调用。


推荐阅读