我从许多来源(例如this和this)了解到,如果在{{1}中抛出异常,将始终调用Dispose
的{{1}}方法阻止。那么我有这个代码:
IDisposable
当抛出未处理的异常时,它退出应用程序。永远不会调用Using
方法。为什么呢?
答案 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()。