CancelKeyPressイベントが発生するまでコンソールを開いたままにするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/203246

  •  03-07-2019
  •  | 
  •  

質問

CancelKeyPressイベントが発生しない限り、コンソールアプリケーションを開いたままにする最良の方法は何ですか?

入力を受け入れたくないので、Console.ReadまたはConsole.ReadLineを使用したくない。基になるアプリケーションが起動されたときにコンソールイベントの詳細を出力できるようにするだけです。次に、CancelKeyPressイベントが発生したら、アプリケーションを正常にシャットダウンします。

役に立ちましたか?

解決

「アプリケーションを正常にシャットダウンする」と仮定しています。ここで苦労している部分です。それ以外の場合、アプリケーションはctrl-cで自動的に終了します。タイトルを変更する必要があります。

これは、あなたが必要だと思うものの簡単なデモです。ロックと通知用モニターの使用により、さらに洗練される可能性があります。あなたが何を必要としているのか正確にはわからないので、私はこれをポーズします...

class Program
{

    private static volatile bool _s_stop = false;

    public static void Main(string[] args)
    {
        Console.CancelKeyPress += new ConsoleCancelEventHandler(Console_CancelKeyPress);
        while (!_s_stop)
        {
            /* put real logic here */
            Console.WriteLine("still running at {0}", DateTime.Now);
            Thread.Sleep(3000);
        }
        Console.WriteLine("Graceful shut down code here...");

        //don't leave this...  demonstration purposes only...
        Console.ReadLine();
    }

    static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
    {
        //you have 2 options here, leave e.Cancel set to false and just handle any
        //graceful shutdown that you can while in here, or set a flag to notify the other
        //thread at the next check that it's to shut down.  I'll do the 2nd option
        e.Cancel = true;
        _s_stop = true;
        Console.WriteLine("CancelKeyPress fired...");
    }

}

_s_stopブール値はvolatileとして宣言する必要があります。そうしないと、過度に野心的なオプティマイザによりプログラムが無限ループする可能性があります。

他のヒント

サンプルコードで _s_stop ブール値をvolatileとして宣言する必要があります。そうしないと、過度に野心的なオプティマイザによってプログラムが無限ループする可能性があります。

すでにアプリケーションを終了するCancelKeyPressにバインドされたハンドラーがあります。これにフックする唯一の理由は、イベントをインターセプトしてアプリが閉じないようにする場合です。

あなたの状況では、アプリを無限ループに入れて、組み込みのイベントハンドラーに強制終了させます。 Wait(1)またはバックグラウンドプロセスのようなものを使用して、何もしない間に大量のCPUを使用しないようにすることができます。

これはあなたが探しているものかもしれません:

http://msdn.microsoft.com/en -us / library / system.console.cancelkeypress.aspx

F5(デバッグ)の代わりに CTRL + f5 のキーボードキーで、デバッグせずにプログラムまたはコードを実行するだけです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top