C# コンソール アプリで Ctrl+C (SIGINT) をトラップするにはどうすればよいですか? 質問する

C# コンソール アプリで Ctrl+C (SIGINT) をトラップするにはどうすればよいですか? 質問する

CtrlC# コンソール アプリケーションで+をトラップしCて、終了前にクリーンアップを実行できるようにしたいと考えています。これを行う最善の方法は何ですか?

ベストアンサー1

コンソール.CancelKeyPressイベントはこれに使用されます。使用方法は次のとおりです。

public static void Main(string[] args)
{
    Console.CancelKeyPress += delegate {
        // call methods to clean up
    };

    while (true) {}
}

ユーザーがCtrl+を押すとC、デリゲート内のコードが実行され、プログラムが終了します。これにより、必要なメソッドを呼び出してクリーンアップを実行できます。デリゲートの後のコードは実行されないことに注意してください。

この方法が適さない状況もあります。たとえば、プログラムが現在重要な計算を実行しており、それをすぐに停止できない場合などです。その場合、計算が完了したらプログラムを終了するように指示するのが正しい戦略かもしれません。次のコードは、これを実装する方法の例を示しています。

class MainClass
{
    private static bool keepRunning = true;

    public static void Main(string[] args)
    {
        Console.CancelKeyPress += delegate(object? sender, ConsoleCancelEventArgs e) {
            e.Cancel = true;
            MainClass.keepRunning = false;
        };
        
        while (MainClass.keepRunning) {
            // Do your work in here, in small chunks.
            // If you literally just want to wait until Ctrl+C,
            // not doing anything, see the answer using set-reset events.
        }
        Console.WriteLine("exited gracefully");
    }
}

このコードと最初の例の違いは、がe.Canceltrue に設定され、デリゲートの後に実行が継続されることです。実行されると、プログラムはユーザーがCtrl+を押すまで待機しますC。それが起こると、keepRunning変数の値が変更され、while ループが終了します。これは、プログラムを正常に終了させる方法です。

おすすめ記事