[英]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
在幕后为您所做的。
如果您有一个希望保持打开的日志文件,那么操作系统将在应用程序退出时释放该文件作为关闭进程的一部分。 您实际上不必明确地管理它。
让操作系统清理您的文件句柄的一个问题是,您的文件编写器将使用缓冲,并且它可能需要刷新才能写出其缓冲区的剩余部分。 如果您不调用 close\dispose ,您可能会丢失信息。 强制刷新的一种方法是挂钩AppDomain
卸载事件,该事件将在您的 .Net 进程关闭时调用,例如:
AppDomain.CurrentDomain.DomainUnload += delegate { logWriter.Dispose(); };
域卸载事件处理程序中可能发生的事情是有时间限制的,但是将文件写入器缓冲区的剩余部分写出就在此范围内。 我假设您有一个默认设置,即一个默认AppDomain
,否则事情会变得棘手,包括日志记录。
如果您保持文件打开,请考虑使用允许其他进程具有读取访问权限的访问权限打开它。 这将使诸如文件尾程序或文本编辑器之类的程序能够在程序运行时用于读取文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.