2009-06-24 4 views
10

Ich arbeite an einem Fehler, bei dem Code nicht immer ausgeführt wird, bevor eine Anwendung heruntergefahren wird. Der Code befand sich in einem Handler für das AppDomain.CurrentDomain.DomainUnload-Ereignis.ProcessExit vs DomainUnload

ich einen Beitrag von jemandem mit dem gleichen Problem, die von der Zeit

“diesen Rat erhielt fand die DomainUnload Event für Ihre Standard-App Domain geschieht, Ihr Code ausgeführt wird beendet. Sie kann wahrscheinlich tun, was Sie brauchen mit dem ProcessExit-Ereignis in der Standard-AppDomain. "

Das funktionierte für mich, aber ich würde gerne wissen, warum. Ich habe nicht viel über diese Ereignisse oder über die Unterschiede zwischen ihnen herausgefunden. Ich frage mich auch, ob ich beide abonnieren muss oder der ProcessExit ausreicht.

EDIT:

Ich wollte mehr Informationen hinzuzufügen dies ein wenig nützlicher zu machen.

Ich habe ausgeschlossen, dass neue Threads in ihrer eigenen AppDomain erstellt wurden. Da ich wollte, dass dieser Code nicht nur dann ausgeführt wurde, wenn der Elternprozess abgeschlossen war, sondern auch, wenn jeder Thread fertig war, musste ich das DomainUnload-Ereignis abonnieren, um den Abschluss jedes Threads und das ProcessExit-Ereignis nach Beendigung des Elternprozesses zu verarbeiten.

Antwort

13

ProcessExit sollte ausreichen.

Das Ereignis DomainUnload wurde entwickelt, um von anderen AppDomains verarbeitet zu werden, nicht von der AppDomain, die entladen wird. Wenn der Handler in der Domäne angefügt wird, die entladen wird, wird es daher möglicherweise nicht ausgeführt. Das Ereignis ProcessExit wird ausgeführt, wenn der Prozess zu Exit geht.

+0

[MSDN] (http://msdn.microsoft.com/en-us/library/system.appdomain.domainunload (v = vs.110) .aspx) sagt 'AppDomain.DomainUnload' Event" tritt auf, wenn eine AppDomain wird gerade entladen. " und soll von der 'AppDomain' verwendet werden, die entladen wird. –

+0

@MehrdadAfshari: Es scheint, dass es nicht so ist: "daran erinnert werden, dass, nachdem das DomainUnload-Ereignis ausgelöst wird, Sie nie ein ProcessExit-Ereignis sehen werden, weil Ihre AppDomain bereits gegangen ist" - http://www.codeproject.com/Articles/16164/ Managed-Application-Herunterfahren –