Как отловить завершение приложения?
От: xpg934 Россия www.siisltd.ru
Дата: 05.09.07 06:03
Оценка:
Необходимо подписаться на некое событие, происходящее при завершении приложения, но происходящее ДО ожидания завершения всех foreground thread'ов.
Есть такое? AppDomain.ProcessExit происходит после, и не подходит.

Нужно это всё чтобы при завершении приложения исвестить foreground thread'ы (вызвать ManualResetEvent.Set(), чтобы они тоже завершались, а то происходит подвисание, т.к. главный тред ждет завершения остальных, а они и не знают что надо завершаться.

Использовать Thread.IsBackground=true нельзя, т.к. тред должен завершиться корректно, и должен подчистить за собой всё что надо.
Re: Как отловить завершение приложения?
От: Nikolkos  
Дата: 05.09.07 07:06
Оценка:
Здравствуйте, xpg934, Вы писали:

X>Нужно это всё чтобы при завершении приложения исвестить foreground thread'ы (вызвать ManualResetEvent.Set(), чтобы они тоже завершались, а то происходит подвисание, т.к. главный тред ждет завершения остальных, а они и не знают что надо завершаться.


Я так понимаю, это необходимо сделать при аварийном завершении приложения? Иначе, при обычном завершении приложения, проблем с извещением потоков быть не должно. Тогда можно подписаться на AppDomain.UnhandledException, где и вызывать ManualResetEvent.Set() и ждать Thread.Join завершения потоков.
Re[2]: Как отловить завершение приложения?
От: xpg934 Россия www.siisltd.ru
Дата: 05.09.07 07:28
Оценка:
X>>Нужно это всё чтобы при завершении приложения исвестить foreground thread'ы (вызвать ManualResetEvent.Set(), чтобы они тоже завершались, а то происходит подвисание, т.к. главный тред ждет завершения остальных, а они и не знают что надо завершаться.

N>Я так понимаю, это необходимо сделать при аварийном завершении приложения? Иначе, при обычном завершении приложения, проблем с извещением потоков быть не должно. Тогда можно подписаться на AppDomain.UnhandledException, где и вызывать ManualResetEvent.Set() и ждать Thread.Join завершения потоков.


это конечно выход, но хотелось бы всё же узнать, есть ли возможность сделать тоже самое и при обычном завершении приложения?
тред создается в конструкторе класса, а в деструкторе — завершается, но, ожидание завершения треда происходит до вызова деструкторов объектов. Делаю конечно сейчас принудительный вызов Dispose для этого класса... но... хочется автоматизации этого процесса.

была мысль сделать свою реализацию менеджера для завершения тредов, и в нем регистрировать все создаваемые треды (или соответствующие ManuaResetEvent), а в Program.Main делать try {} finally {}, и в блоке finally как раз и устанавливать все event-ы. Но... опять обход проблемы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.