繁体   English   中英

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

[英]how to catch program shutdown to release resources?

在我正在使用的程序中

logWriter = File.CreateText(logFileName);

存储日志。

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

正常的方法是将File.CreateText包装在using语句中

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

但是,如果您希望logWriter在您的应用程序的持续时间内存在,这是不方便的,因为您很可能不希望using语句环绕您的应用程序的Main方法。

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

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

您可以using -block 来包装它,但我宁愿将它放在单独的 class 中。 这样将来您可以处理更多高级日志记录,例如,当您的应用程序在多个线程上运行并且您尝试同时写入文件时会发生什么?

log4net 可以配置为使用文本文件或数据库,如果应用程序增长,它很容易更改。

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

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

AppDomain.CurrentDomain.DomainUnload += delegate { logWriter.Dispose(); };

域卸载事件处理程序中可能发生的事情是有时间限制的,但是将文件写入器缓冲区的剩余部分写出就在此范围内。 我假设您有一个默认设置,即一个默认AppDomain ,否则事情会变得棘手,包括日志记录。

如果您保持文件打开,请考虑使用允许其他进程具有读取访问权限的访问权限打开它。 这将使诸如文件尾程序或文本编辑器之类的程序能够在程序运行时用于读取文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM