C#コンソールアプリケーションでの優雅なシャットダウン:出口イベントの処理
マルチスレッドC#コンソールアプリケーションでは、適切なリソース管理を確保するために、終了時に堅牢なクリーンアップ手順が必要です。 .NETは組み込みの出口イベントを提供していませんが、信頼できるソリューションのためにWin32 APIを活用できます。
直接.NETイベントの欠如残念ながら、.NETフレームワークには、アプリケーションの終了を検出するための直接的なイベントがありません。
win32 APIの利用:実用的なアプローチwin32 APIの関数は、コンソールの閉鎖を含むさまざまなコントロール信号のハンドラーを登録するメカニズムを提供します。これにより、アプリケーションが終了する前にカスタムコードを実行できます。
コードの例:コンソール出口ハンドラーの実装SetConsoleCtrlHandler
重要な考慮事項と制限:
<code class="language-csharp">using System; using System.Runtime.InteropServices; // ... other using statements ... public class Program { [DllImport("Kernel32.dll")] private static extern bool SetConsoleCtrlHandler(HandlerRoutine handler, bool add); private delegate bool HandlerRoutine(CtrlTypes ctrlType); private enum CtrlTypes { CTRL_C_EVENT = 0, CTRL_BREAK_EVENT = 1, CTRL_CLOSE_EVENT = 2, CTRL_LOGOFF_EVENT = 5, CTRL_SHUTDOWN_EVENT = 6 } private static bool Handler(CtrlTypes ctrlType) { Console.WriteLine("Console exit event detected: " + ctrlType); // Perform cleanup operations here (e.g., closing files, stopping threads) return true; // Indicate that the handler processed the event } public static void Main(string[] args) { SetConsoleCtrlHandler(Handler, true); // ... your application's main logic ... Console.ReadKey(); // Keep the console open until a key is pressed } }</code>このアプローチはWindows APIに依存しており、非窓環境に直接移植可能ではない場合があります。
関数は、ファイルの閉鎖、リソースのリリース、を返す前にスレッド終了を確保するなど、必要なすべてのクリーンアップタスクを実行する必要があります。 返品は、デフォルトのシステムハンドラーを呼び出す必要があることを示します。
関数内の潜在的な例外を処理することを忘れないでください以上がC#でコンソールアプリケーションエグジットイベントを処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。