【发布时间】:2011-06-07 02:37:27
【问题描述】:
我正在努力提高一段代码的异常安全性,我意识到引发的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 可以随时提出,这意味着我应该注意语句之间发生的事情。虽然我可以使用 try/finally 块来防止 CreateWriter 中的异常,但 using 构造在评估括号中的表达式之前不会做同样的事情,这意味着如果发生异常,文件资源将保持打开状态在CreateWriter 返回后立即。
我知道终结器最终会释放文件句柄,但我想知道是否有确定性的方法来解决这个问题,而无需在每个使用 CreateWriter 的地方捕获 ThreadAbortException。
【问题讨论】:
标签: c# .net idisposable using threadabortexception