Выгрузить событие для домена по умолчанию? - PullRequest
1 голос
/ 29 декабря 2010

Мне нужно, чтобы событие запускалось всякий раз, когда any AppDomain выгружается, включая одно из процессов по умолчанию.Проблема с AppDomain.DomainUnload заключается в том, что он запускается только для доменов приложений, отличных от заданных по умолчанию.Кроме того, AppDomain.ProcessExit имеет ограниченное время выполнения, на которое я не могу положиться.

Буду очень признателен за любые предложения относительно того, как я могу добиться этого!

(В противном случае, если событие будет запущено, когдафоновый поток (Thread.IsBackground == True) тоже работает.)

Ответы [ 4 ]

1 голос
/ 06 января 2011

Почему вы не помещаете свой код в конец Main?

Что касается события:

Нет события, которое будет выполнено при выгрузке домена приложения.Если вы разработчик библиотеки, вы добавляете деструктор в свой начальный класс.Но учтите, что все может быть собрано неправильно.Прочитайте этот ответ: https://stackoverflow.com/a/2735431/70386

0 голосов
/ 04 января 2011

А как насчет использования оболочки / программы запуска вокруг вашего основного приложения?Этот AppDomain может заметить, когда его дочерний элемент заканчивается (посредством блокировки, опроса или обратного вызова) и может выполнять любые дополнительные операции.

Аналогично, если main () состоит из запуска одного потока, который выполняет все важные действиязатем main () также может выполнить любую дополнительную работу.

Возможно, это поможет, если вы сможете объяснить, что вам нужно делать в ответ на каждое завершение AppDomain?Возможно, то, что вы просите сделать, просто не подходит на уровне AppDomain.

0 голосов
/ 06 января 2011

Если ваша цель здесь состоит в том, чтобы аккуратно избавиться от объектов, которые используются некоторыми фоновыми потоками, тогда мое предложение будет:

  1. Если вы хотите выйти из приложения, сообщите фоновым потокам, что они должны очиститься и остановиться.

  2. В главном потоке используйте Thread.Join, чтобы дождаться окончания всех фоновых потоков и выйти из него.

0 голосов
/ 03 января 2011

http://msdn.microsoft.com/en-us/library/system.appdomain.domainunload%28v=VS.90%29.aspx ..но опять это вызывается перед выгрузкой домена.

Взято из http://msdn.microsoft.com/en-us/library/system.appdomain.unload.aspx В .NET Framework версии 2.0 есть ветка, посвященная выгрузке доменов приложений. Это повышает надежность, особенно когда размещается .NET Framework. Когда поток вызывает Unload, целевой домен помечается для выгрузки. Выделенный поток пытается выгрузить домен, и все потоки в домене прерываются. Если поток не прерывается, например, потому что он выполняет неуправляемый код или потому, что он выполняет блок finally, то через некоторое время в потоке, первоначально вызвавшем Unload, создается исключение CannotUnloadAppDomainException. Если поток, который не может быть прерван, в конце концов заканчивается, целевой домен не выгружается. Таким образом, в домене .NET Framework версии 2.0 не гарантируется выгрузка домена, поскольку может быть невозможно прервать выполнение потоков.

...