C#:在终结器中,如何确定应用程序是否正在关闭?

时间:2011-04-20 07:48:53

标签: c# .net destructor finalizer application-shutdown

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

谢谢!

3 个答案:

答案 0 :(得分:13)

System.Environment.HasShutdownStarted

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

答案 1 :(得分:4)

我认为AppDomain.IsFinalizingForUnload()会提供此信息。

答案 2 :(得分:1)

如果已经将它们丢弃,你真的需要将它们丢弃在终结器中吗? 或者反过来说:你不可能通过IDisposable模式处理它们吗?

即使它是您在应用的生命周期中抓住的资源,您仍然可以将其用于使用:

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

编辑:除了一些有趣的答案[1]之外,这有点像整个事情都有些不对劲。

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

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