2009-06-24 6 views
10

Je travaille sur un bogue où le code n'est pas toujours exécuté avant l'arrêt d'une application. Le code était dans un gestionnaire pour l'événement AppDomain.CurrentDomain.DomainUnload.ProcessExit vs DomainUnload

J'ai trouvé un poste par une personne ayant le même problème qui a reçu cet avis

« Au moment où l'événement DomainUnload se produit pour votre domaine d'application par défaut, votre code a arrêté l'exécution. Vous pouvez probablement faire ce que vous avez besoin avec l'événement ProcessExit sur l'AppDomain par défaut. "

Cela a fonctionné pour moi mais je voudrais savoir pourquoi. Je n'ai pas été en mesure de trouver beaucoup sur ces événements ou sur les différences entre eux. Je me demande aussi si je dois m'abonner aux deux ou si le ProcessExit est suffisant.

EDIT:

Je voulais ajouter plus d'informations pour en faire un peu plus utile.

J'ai laissé de côté que de nouveaux threads étaient créés dans leur propre AppDomain. Comme je voulais que ce code s'exécute non seulement lorsque le processus parent était terminé, mais aussi lorsque chaque thread se terminait, je devais m'abonner à l'événement DomainUnload à gérer à la fin de chaque thread et aussi à l'événement ProcessExit pour terminer le processus parent.

Répondre

13

ProcessExit devrait suffire.

L'événement DomainUnload est conçu pour être géré par d'autres AppDomains, et non le AppDomain en cours de déchargement. Par conséquent, si le gestionnaire est attaché dans le domaine en cours de déchargement, il risque de ne pas fonctionner. L'événement ProcessExit est conçu pour s'exécuter lorsque le processus est allant à exit.

+0

[MSDN] (http://msdn.microsoft.com/en-us/library/system.appdomain.domainunload (v = vs.110) .aspx) indique que «AppDomain.DomainUnload' Event» se produit lorsqu'un AppDomain est sur le point d'être déchargé. " et est destiné à être utilisé par le 'AppDomain' étant déchargé. –

+0

@MehrdadAfshari: Il semble que ce n'est pas le cas: 'rappelez-vous qu'après l'événement DomainUnload est déclenché, vous ne verrez jamais un événement ProcessExit parce que votre AppDomain est déjà parti» - http://www.codeproject.com/Articles/16164/ Managed-Application-Shutdown –