J'ai une application console qui contient pas mal de threads. Il existe des threads qui surveillent certaines conditions et mettent fin au programme si elles sont vraies. Cette résiliation peut survenir à tout moment.
J'ai besoin d'un événement qui peut être déclenché lorsque le programme se ferme afin de pouvoir nettoyer tous les autres threads et fermer correctement tous les descripteurs de fichiers et toutes les connexions. Je ne sais pas s'il y en a déjà un intégré dans le framework .NET, donc je le demande avant d'écrire le mien.
Je me demandais s'il y avait eu un événement du genre:
MyConsoleProgram.OnExit += CleanupBeforeExit;
Réponses:
Je ne sais pas où j'ai trouvé le code sur le Web, mais je l'ai trouvé maintenant dans l'un de mes anciens projets. Cela vous permettra de faire du code de nettoyage dans votre console, par exemple lorsqu'elle est brusquement fermée ou en raison d'un arrêt ...
Mettre à jour
Pour ceux qui ne vérifient pas les commentaires, il semble que cette solution particulière ne fonctionne pas bien (ou pas du tout) sous Windows 7 . Le fil suivant en parle
la source
bool Handler()
doitreturn false;
(il ne renvoie rien dans le code) pour que cela fonctionne. Si elle renvoie true, Windows affiche la boîte de dialogue "Terminer le processus maintenant". = DExemple de travail complet, fonctionne avec ctrl-c, ferme les fenêtres avec X et tue:
la source
Handler
sauf pour lareturn true
boucle et une boucle while pour compter les secondes. L'application continue de fonctionner sur ctrl-c mais se ferme après 5 secondes lors de la fermeture avec le X.Handler
méthode {en utilisant Win10, .NET Framework 4.6.1}Vérifiez également:
la source
Console.CancelKeyPress
alors l'ProcessExit
événement est réellement déclenché après l'CancelKeyPress
exécution de tous les gestionnaires d'événements.J'ai eu un problème similaire, juste mon application console fonctionnerait en boucle infinie avec une déclaration préventive au milieu. Voici ma solution:
la source
On dirait que les threads terminent directement l'application? Il serait peut-être préférable qu'un thread signale le thread principal pour dire que l'application doit être terminée.
Sur réception de ce signal, le thread principal peut arrêter proprement les autres threads et finalement se fermer.
la source
La réponse de ZeroKelvin fonctionne dans Windows 10 x64, application console .NET 4.6. Pour ceux qui n'ont pas besoin de gérer l'énumération CtrlType, voici un moyen très simple de se connecter à l'arrêt du framework:
Renvoyer FALSE depuis le gestionnaire indique au framework que nous ne «gérons» pas le signal de contrôle, et la fonction de gestionnaire suivante dans la liste des gestionnaires pour ce processus est utilisée. Si aucun des gestionnaires ne renvoie TRUE, le gestionnaire par défaut est appelé.
Notez que lorsque l'utilisateur effectue une déconnexion ou un arrêt, le rappel n'est pas appelé par Windows, mais se termine immédiatement.
la source
Il existe pour les applications WinForms;
Pour les applications de la console, essayez
Mais je ne sais pas à quel moment cela sera appelé ou si cela fonctionnera à partir du domaine actuel. Je suppose que non.
la source
Visual Studio 2015 et Windows 10
Code:
la source
Le lien mentionné ci-dessus par Charle B en commentaire à flq
Au fond, dit:
Quelque part ailleurs dans le fil, il est suggéré de créer une fenêtre cachée. Donc je crée un winform et en onload je me suis attaché à la console et j'exécute Main originale. Et puis SetConsoleCtrlHandle fonctionne correctement (SetConsoleCtrlHandle est appelé comme suggéré par flq)
la source
AllocConsole
comme dans votre exemple) pour afficher des informations supplémentaires. Le problème est que toute l'application (toutes les fenêtres) se ferme si l'utilisateur clique sur le (X) dans la fenêtre de la console. LesSetConsoleCtrlHandler
travaux, mais les arrêts d'application de toute façon avant que le code dans le gestionnaire exécuté (je vois des points d' arrêt et ont tiré à droite , puis les arrêts d'application).Pour ceux qui s'intéressent à VB.net. (J'ai cherché sur Internet et je n'ai pas trouvé d'équivalent) Ici, il est traduit en vb.net.
la source