在应用程序关闭时将信息存储到文件的正确方法

jav*_*red 6 c#

我的一个类在应用程序执行期间收集统计信息,我希望在应用程序完成时将此统计信息存储到磁盘.我从来没有在我的程序中销毁这个类,所以我试图将日志存储到文件中:

    ~Strategy()
    {
        foreach(var item in statisticItems)
        {
            log.WriteLine(item.Text);    // log is AutoFlush
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是我没有看到我期望看到的日志,并且在析构函数调用时我也无法在调试器中"捕获".

问题:

  • 为什么在调试器中我无法捕获析构函数被调用的时刻?程序完成后,是否必须为每个对象调用析构函数?
  • 我应该用什么来记录我的东西?

Ken*_*rey 1

析构函数(或终结器)不是放置此类代码的地方。它旨在释放非托管资源。析构函数的调用是不确定的,因此您不能依赖任何对象在析构函数内有效。而且您无法在调试器中捕获它,因为在非常特殊的情况下,它是在单独的线程上调用的。简而言之,不要使用析构函数,除非您知道需要这样做。

记录应用程序关闭的理想方法是简单地将日志记录代码放在方法的末尾Main。您应该确保捕获并记录抛出的任何异常,如果是这种情况,您可以在 末尾记录关闭Main

在某些极端情况下,由于堆栈溢出等错误,您将无法记录关闭。在这些情况下,您将需要依赖错误之前发生的情况的日志。