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