IDisposable.Dispose在使用块中的异常后永远不会被调用

时间:2015-06-24 12:13:49

标签: c# .net exception idisposable using-statement

我从许多来源(例如thisthis)了解到,如果在{{1}中抛出异常,将始终调用Dispose的{​​{1}}方法阻止。那么我有这个代码:

IDisposable

当抛出未处理的异常时,它退出应用程序。永远不会调用Using方法。为什么呢?

3 个答案:

答案 0 :(得分:11)

Environment.Exit将终止程序

  

如果从try或finally块调用Exit,则任何catch中的代码   块不执行。如果使用return语句,则代码在   catch块确实执行。

using (var x = new Disposable())
{
    throw new Exception("asdfsdf");
}

将转换为

Disposable x = new Disposable();
try
{
    throw new Exception("asdfsdf");
}
finally
{
    if (x != null)
        x.Dispose();
}

答案 1 :(得分:2)

请注意,如果您已将终结器添加到public class Disposable : IDisposable { public void Dispose() { Dispose(true); } protected virtual void Dispose(bool disposing) { Console.WriteLine("I am disposed"); if (disposing) { GC.SuppressFinalize(this); } } ~Disposable() { Dispose(false); } } ,例如:

IDisposable

(所以使用"完整" Environment.Exit模式),然后"通常"将调用终结器(因为终结器有机会在Dispose(bool disposing)上运行),该方法将调用awk。请注意,即使在这里也可能无法运行终结器,因为它们有一个时间限制,see

答案 2 :(得分:0)

完全!由于在事件处理程序中调用了Environment.Exit(0),因此无法调用Dispose方法中的代码。

尝试删除对Environment.Exit(0)的调用,看看是否调用了Debug.Print()。