【发布时间】:2012-07-06 03:10:42
【问题描述】:
我有一个单例记录器类。在它的析构函数中,我调用 Close() 打印日志的页脚,然后关闭 StreamWriter。
public void Close()
{
WriteLogFileFooter();
_logFile.Flush();
_logFile.Close();
}
问题是当 System.Enviornment.Exit(1) 从程序的其他地方(我自己没有编写的部分)调用时,页脚永远不会打印,并且我的记录器会抛出异常以尝试写入封闭流。我只能假设 Exit 命令导致我的 StreamWriter 在我的 Singleton 被破坏之前关闭。我尝试在我的 StreamWriter 上使用 GC.SupressFinalize() 但这似乎没有帮助。
【问题讨论】:
-
你的单例实现是可丢弃的,而来自该实现的 Dispose 就是所谓的 Close 类?
-
简而言之,你不能这样做。您无法从终结器访问托管对象(例如流),无法保证它将处于何种状态,或者它是否会存在。
-
我一直想知道为什么人们要重新发明轮子。为什么人们不使用框架中内置的内容来执行日志记录和跟踪?我什至没有提到第三方工具。我只是想知道为什么人们不使用框架中已经存在的东西。出于好奇,仅此而已。
-
那我邀请你去看看
System.Diagnostics.Trace类。 -
正如大家所说,从终结者那里调用
Console.WriteLine甚至都不安全。