マルチスレッドコンソールアプリケーションでは、シームレスなプログラムの終了が課題になる可能性があります。一部のスレッドは、特定の条件を監視し、いつでもプログラムを開始する場合があります。正しいクリーニングとリソースのリリースを確実にするために、開発者は通常、プログラムの閉鎖前にトリガーされるビルドイベントを探します。
コンソールの撤回をキャプチャする方法は、カスタムイベントを通じて手順を処理することです。 Windows APIの
関数を使用して、イベント処理プログラムをインストールして、シャットダウン、シャットダウン、ユーザーの中断など、さまざまな出口イベントを傍受できます。
SetConsoleCtrlHandler
次のコードフラグメントは、このテクノロジーを示しています
メソッドは、クリーニングコードをトリガーするイベントのタイプをフィルタリングする方法を提供します。この例では、コンソールの閉鎖、システムのシャットダウン、およびユーザー中断(CTRL C)インシデントを処理します。 は、出口信号が正常に処理されていることを示しており、プロシージャはプログラムがエレガントに出ることを許可しています。
<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>このソリューションが特定のオペレーティングシステム(特にWindows 7)の制限に遭遇する可能性があることは注目に値します。問題が発生した場合は、オンラインリソースやその他の処理コンソールのインシデントを終了する方法を参照してください。 コードの堅牢性を確保するために、可能性のある異常をキャプチャするためのトライキャッチブロックなど、エラー処理メカニズムを
メソッドに追加することをお勧めします。 Handler
以上がC#でコンソールアプリケーションの終了イベントを優雅に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。