4

我有一个在应用程序关闭期间似乎总是失败的终结器。我认为这是因为它持有一些在那时不再有效的原生资源。有没有办法在析构函数/终结器中判断它是否由于应用程序关闭而被调用?

谢谢!

4

3 回答 3

13
System.Environment.HasShutdownStarted

此处的文档:http: //msdn.microsoft.com/en-us/library/system.environment.hasshutdownstarted.aspx

于 2011-04-20T07:51:18.413 回答
4

我想这AppDomain.IsFinalizingForUnload()会提供这些信息。

于 2011-04-20T07:52:39.990 回答
1

如果它们已经以其他方式处理,您真的需要在终结器中处理它们吗?
或者反过来:您是否可以通过 IDisposable 模式处理它们?

即使它是您在应用程序的整个生命周期中一直持有的资源,您仍然可以将其放入 using:

static void Main()
{
  using(var yourResource = ...)
  {
     ...
     yourMainForm.YourResource = yourResource;
     Application.Run...
  }
}

编辑:除了一些有趣的答案[1],这听起来像是整个事情有问题。

如果终结器由于资源已被处理而失败,那么某处存在问题。
如果此资源对于正确处置至关重要,则应正确处理。
我不确定“在 UI 中某处引用”是否足够好。做对并不难,即使这是在 Form 左右完成的。您可以覆盖表单或组件或控制器的 dispose 以确定性地执行此操作。

[1] 如果有一天它咬我可能会派上用场......

于 2011-04-20T07:53:53.907 回答