如何捕获程序关闭以释放资源?

时间:2011-07-04 20:43:07

标签: c# .net

在我的程序中我使用

logWriter = File.CreateText(logFileName);

存储日志。

我应该调用logWriter.Close()吗?应该是finalizer还是其他什么?

3 个答案:

答案 0 :(得分:3)

通常的方法是将File.CreateText括在using语句中

using (var logWriter = File.CreateText(logFileName))
{
    //do stuff with logWriter 
}

但是,如果您希望logWriter在应用期间有效,这很不方便,因为您很可能不希望using语句包围您应用的Main方法。

在这种情况下,您必须确保在应用终止之前在Dispose上致电logWriter,这正是using在幕后为您所做的。

答案 1 :(得分:1)

是的,您应该在完成后关闭文件。您可以创建一个日志类(或使用现有的类log4net)并实现IDisposable,并在Dispose - 方法中释放资源。

你可以用using块来包装它,但我宁愿把它放在一个单独的类中。这种方式将来你可以处理更多高级日志记录,例如,当你的应用程序在多个线程上运行并且你试图同时写入文件时会发生什么?

log4net可以配置为使用text-file or a database,如果应用程序增长,它很容易更改。

答案 2 :(得分:0)

如果您有一个希望保持打开的日志文件,那么操作系统将在应用程序退出时将该文件作为关闭过程的一部分释放该文件。您实际上不必明确地管理它。

让操作系统清理文件句柄的一个问题是你的文件编写器将使用缓冲,它可能需要刷新才会写出其缓冲区的剩余部分。如果你不打电话关闭\ dispose,你可能会丢失信息。强制刷新的一种方法是挂钩{。1}}卸载事件,当.Net进程关闭时将调用该事件,例如:

AppDomain

域卸载事件处理程序中可能发生的事情有一个时间限制,但写出文件编写器缓冲区的剩余部分就在此范围内。我假设您有一个默认设置,即一个默认AppDomain.CurrentDomain.DomainUnload += delegate { logWriter.Dispose(); }; ,否则一切都会变得棘手,包括记录。

如果要保持文件处于打开状态,请考虑使用允许其他进程具有读取权限的访问权限打开它。这样就可以在程序运行时使用文件管理器或文本编辑器等程序来读取文件。