Est-ce que le travail de l'événement Application.ApplicationExit à notifier de sortie dans les applications non-Winforms?

StackOverflow https://stackoverflow.com/questions/529867

Question

Notre bibliothèque de code doit être informé lorsque l'application est sortie. Nous avons donc souscrit à l'événement System.Window.Forms.Application.ApplicationExit. Cela fonctionne bien pour les applications Winforms, mais ça marche aussi pour d'autres types d'applications telles que les applications de la console, des services et des applications Web (tels que ASP.NET)? L'espace de nom suggère qu'il n'a pas, et il se vraisemblablement déclenché lorsque Application.Exit() est appelé (explicitement ou implictly), qui ne peut être correct d'appeler ces autres cas.

Y at-il un autre événement qui serait mieux dans ces autres cas, ou qui serait plus universel (Si cela fonctionne pour Winforms, aussi)? Par exemple, est-il un événement quand Environment.Exit() est appelé (application de la console)?

J'ai trouvé une mention d'un événement Exited à System.Diagnostic.Process, mais cela semble être pour surveiller la sortie de une autre processus, et il ne semble pas être reçu par un processus au sujet lui-même (par exemple, Process.GetCurrentProcess().Exited += Process_Exited; Process.GetCurrentProcess().EnableRaisingEvents = true;). Je pense qu'il ne peut être soulevée après que le processus a effectivement sorti, de sorte que ne fonctionnerait pas.

Ceci est particulièrement pour .NET 2.0 et C #.

Était-ce utile?

La solution

Nous avons finalement trouvé plus à ce sujet (mais alors ma machine avait été reconstruit et a perdu les cookies pour mon profil non enregistré ici, je l'espère, il laissera rencontré après cette réponse).

Une enquête plus poussée a finalement trouvé quelques autres événements que nous avons trouvé utile:

System.Windows.Forms.Application.ThreadExit - se déclenche quand une sortie de la boucle de message System.Windows.Forms.Application.ApplicationExit - Se déclenche lorsque tous les messages boucles de sortie System.AppDomain.CurrentDomain.DomainUnload - Les incendies lorsqu'un domaine autre que les sorties par défaut System.AppDomain.CurrentDomain.ProcessExit - Se déclenche lorsque la sortie de domaine d'applications par défaut System.AppDomain.CurrentDomain.UnhandledException -. déclenche lorsque survient une exception non capturée, mettant fin à l'application

Un seul des événements DomainUnload ou ProcessExit sont possibles pour un domaine d'application donné, selon qu'il est la valeur par défaut (niveau supérieur) domaine pour le processus ou a été créé comme un sous-domaine (par exemple. Sur un serveur web). Si une application ne sait pas où il pourrait être (comme dans notre cas), il doit souscrire à la fois si elle veut attraper le réel pour lui-même décharger. En outre, il semble que UnhandledException (qui, comme de .NET2.0 est toujours fatale) peut empêcher les deux autres événements, de sorte que peut-être un troisième cas à manipuler. Ces trois événements devraient fonctionner pour toutes les applications .NET.

Il y a une mise en garde que le temps d'exécution pour ProcessExit est limitée (environ 4 secondes?), Donc il ne peut pas être possible de faire d'importants travaux « finale » dans ce gestionnaire d'événements. Il doit être quelque chose qui peut être fait rapidement.

Les événements Application appliquent uniquement aux applications WinForms (nous soupçonnons qu'ils ne peuvent pas appliquer dans des applications pures WPF, cependant). La dénomination peut être trompeur parce qu'ils sont nommés pour leur plus une utilisation normale de base qui a certaines hypothèses. ThreadExit ne se rapporte pas à la System.Threading.Thread réelle, mais plutôt à la boucle de message (Application.Run())) d'un fil d'interface utilisateur, et ApplicationExit concerne de manière similaire à la collecte des formulaires de demande sur un ou plusieurs fils d'interface utilisateur. Normalement, une fois que l'appel à Application.Run() déclarations, appelées par la méthode d'entrée d'un fil, la méthode d'entrée se termine rapidement et le fil se termine alors. Et une fois que toutes les discussions UI ont quitté, une application WinForms est généralement tout fait et les sorties.

Un autre événement de la note est l'événement System.Windows.Forms.Application.ThreadException. Une boucle de message Windows peut être configuré pour intercepter des exceptions qui se produisent dans la manipulation d'un message et envoyer cet événement plutôt que de les laisser des exceptions non rattrapées (et donc fatale). Attraper ces exceptions permet à la boucle de message (et que thread d'interface utilisateur) pour continuer à fonctionner (après l'interruption du gestionnaire de messages en cours). Il ne peut y avoir qu'un seul abonné à cet événement à tout moment pour un fil donné (abonnements écrasent tout abonné précédent), et il doit être configuré avant toute forme est créée et souscrite avant d'entrer dans la boucle de message. Consultez l'aide MSDN pour cet événement et System.Windows.Forms.Applicaton.SetUnhandledExceptionMode() pour plus d'informations.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top