我正在努力提高一段代码的异常安全性,并且我意识到引发ThreadAbortException
可能会导致不希望的资源泄漏,即使在使用 C#using
构造保护资源时也是如此。例如,考虑以下代码(可能在单独的线程中运行)。
using (TextWriter writer = CreateWriter(filename))
{
// do something with the writer.
}
TextWriter CreateWriter(string filename)
{
return new CustomWriter(File.OpenWrite(filename));
}
如果运行此代码的线程异常终止,那么我希望filename
立即关闭引用的文件句柄。我可以在不使用using
try/finally 块替换构造的情况下执行此操作吗?
我的假设是ThreadAbortException
可能随时提出,这意味着我应该注意语句之间发生的事情。CreateWriter
虽然我可以使用 try/finally 块来防止异常,但在using
评估括号中的表达式之前,该构造不会执行相同的操作,这意味着如果异常在CreateWriter
返回后立即发生,则文件资源将保持打开状态。
我知道终结器最终会释放文件句柄,但我想知道是否有一种确定性的方法来解决这个问题,而不需要ThreadAbortException
在每个CreateWriter
使用的地方捕获。