C #: в финализаторе, как узнать, закрывается ли приложение? - PullRequest
4 голосов
/ 20 апреля 2011

У меня есть финализатор, который всегда завершается ошибкой при завершении работы приложения. Я думаю, что это потому, что он держит некоторые собственные ресурсы, которые больше не действительны на тот момент. Есть ли способ определить в деструкторе / финализаторе, вызывается ли он из-за закрытия приложения?

Спасибо!

Ответы [ 3 ]

13 голосов
/ 20 апреля 2011
System.Environment.HasShutdownStarted

Документация здесь: http://msdn.microsoft.com/en-us/library/system.environment.hasshutdownstarted.aspx

4 голосов
/ 20 апреля 2011

Я бы предположил, что AppDomain.IsFinalizingForUnload() предоставит эту информацию.

1 голос
/ 20 апреля 2011

Вам действительно нужно избавиться от них в финализаторе, если они уже были утилизированы иначе?
Или наоборот: разве вы не можете избавиться от них с помощью шаблона IDisposable?

Даже если это ресурс, который вы держите в течение всего срока службы вашего приложения, вы все равно можете использовать его:

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

Редактировать: Помимо некоторых интересных ответов [1], пахнет, как будто что-то не так во всем этом.

Если в финализаторе происходит сбой из-за того, что ресурс уже удален, то где-то возникает проблема.
Если этот ресурс имеет решающее значение для правильной утилизации, то это должно быть сделано правильно.
Я не уверен, что "ссылка где-то в пользовательском интерфейсе" достаточно хороша. Это не так сложно, чтобы получить права, даже если это делается в форме или около того. Вы можете переопределить расположение формы, компонента или контроллера, чтобы сделать это детерминистически.

[1] Может пригодиться, если он когда-нибудь укусит меня ...

...