我正在努力提高一段代码的异常安全性,我意识到引发的 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 block 替换 using
构造的情况下执行此操作吗?
我的假设是 ThreadAbortException
可能随时引发,这意味着我应该注意语句之间发生的事情。虽然我可以使用 try/finally block 来防止 CreateWriter
中的异常,但是 using
构造在评估括号中的表达式之前不会执行相同的操作,这意味着如果在 CreateWriter
返回后立即发生异常,则文件资源保持打开状态。
我知道终结器最终会释放文件句柄,但我想知道是否有确定性的方法来解决这个问题,而无需在 CreateWriter
的每个地方捕获 ThreadAbortException
> 被使用。
最佳答案
是的,避免这种情况的确定性方法是不使用 Thread.Abort
。曾经。向您的线程发出停止时间的信号,并让它们优雅地终止。 Thread.Abort
是一个很大的转移注意力的东西,放在 API 中只是为了让你误会。 ;)
http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation
关于c# - 在 ThreadAbortException 上下文中防止资源泄漏的推荐方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6256094/