我有一个在应用程序关闭期间似乎总是失败的终结器。我认为这是因为它持有一些在那时不再有效的原生资源。有没有办法在析构函数/终结器中判断它是否由于应用程序关闭而被调用?
谢谢!
我有一个在应用程序关闭期间似乎总是失败的终结器。我认为这是因为它持有一些在那时不再有效的原生资源。有没有办法在析构函数/终结器中判断它是否由于应用程序关闭而被调用?
谢谢!
System.Environment.HasShutdownStarted
此处的文档:http: //msdn.microsoft.com/en-us/library/system.environment.hasshutdownstarted.aspx
我想这AppDomain.IsFinalizingForUnload()
会提供这些信息。
如果它们已经以其他方式处理,您真的需要在终结器中处理它们吗?
或者反过来:您是否可以通过 IDisposable 模式处理它们?
即使它是您在应用程序的整个生命周期中一直持有的资源,您仍然可以将其放入 using:
static void Main()
{
using(var yourResource = ...)
{
...
yourMainForm.YourResource = yourResource;
Application.Run...
}
}
编辑:除了一些有趣的答案[1],这听起来像是整个事情有问题。
如果终结器由于资源已被处理而失败,那么某处存在问题。
如果此资源对于正确处置至关重要,则应正确处理。
我不确定“在 UI 中某处引用”是否足够好。做对并不难,即使这是在 Form 左右完成的。您可以覆盖表单或组件或控制器的 dispose 以确定性地执行此操作。
[1] 如果有一天它咬我可能会派上用场......