c# - 在 ThreadAbortException 上下文中防止资源泄漏的推荐方法是什么?

标签 c# .net idisposable using threadabortexception

我正在努力提高一段代码的异常安全性,我意识到引发的 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/

相关文章:

c# - Unity Input.getAxis 可以使用哪些参数?

c# - 如何让用户强制输入某些信息的窗口?

c# - 在 C# 中使用 new 关键字

c# - 使用一次性模式清理 IDispose 成员类

c# - 静态类是否应该在 "static destructor"中处理其 IDisposable 变量?

c# - 反序列化为 JObject 时获取类型名称

c# - .NET 4.0 与旧版本性能比较

c# - 向菜单条添加标签

c# - 如何在运行时动态修改 NHibernate 加载查询?事件监听器?拦截器?

c# - 是否应该为 Process.GetCurrentProcess() 调用 Dispose?