Maison >développement back-end >C++ >Comment puis-je gérer gracieusement les événements de sortie des applications de console en C #?
Dans les applications de console multi-thread, la cessation de programmes transparentes peut être un défi. Certains threads peuvent surveiller les conditions spécifiques et démarrer le programme fermé à tout moment. Afin d'assurer une libération de nettoyage et de ressources correctes, les développeurs recherchent généralement des événements construits déclenchés avant la fermeture du programme.
Une méthode pour capturer le retrait de la console consiste à traiter la procédure via des événements personnalisés. En utilisant la fonction
de l'API Windows, vous pouvez installer un programme de traitement d'événements pour intercepter divers événements de sortie, tels que l'arrêt, l'arrêt ou l'interruption de l'utilisateur.
SetConsoleCtrlHandler
Le fragment de code suivant démontre cette technologie:
La méthode fournit une méthode de filtrage du type d'événement qui devrait déclencher le code de nettoyage. Dans cet exemple, nous gérons la fermeture de la console, l'arrêt du système et l'interruption de l'utilisateur (CTRL C). Notez que indique que le signal de sortie a été traité avec succès, et la procédure permet au programme de quitter élégamment;
<code class="language-csharp">[DllImport("Kernel32")] private static extern bool SetConsoleCtrlHandler(EventHandler handler, bool add); private delegate bool EventHandler(CtrlType sig); static EventHandler _handler; enum CtrlType { CTRL_C_EVENT = 0, CTRL_BREAK_EVENT = 1, CTRL_CLOSE_EVENT = 2, CTRL_LOGOFF_EVENT = 5, CTRL_SHUTDOWN_EVENT = 6 } private static bool Handler(CtrlType sig) { //在此处添加您的清理代码 switch (sig) { case CtrlType.CTRL_C_EVENT: case CtrlType.CTRL_LOGOFF_EVENT: case CtrlType.CTRL_SHUTDOWN_EVENT: case CtrlType.CTRL_CLOSE_EVENT: //执行清理操作 Console.WriteLine("执行清理操作..."); return true; //表示已处理事件 default: return false; //表示未处理事件 } } static void Main(string[] args) { // 注册事件处理程序 _handler += new EventHandler(Handler); SetConsoleCtrlHandler(_handler, true); // ...您的应用程序主代码... Console.WriteLine("程序运行中..."); Console.ReadKey(); // 保持控制台窗口打开,直到用户按下按键 }</code>
Il convient de noter que cette solution peut rencontrer des restrictions sur certains systèmes d'exploitation (en particulier Windows 7). Si vous rencontrez des problèmes, veuillez vous référer à la méthode de sortie de l'incident des ressources en ligne et d'autres consoles de traitement. Afin d'assurer la robustesse du code, il est recommandé d'ajouter un mécanisme de traitement d'erreur à la méthode Handler
, tel que le bloc de capture d'essai pour saisir des anomalies possibles. return true;
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!