9

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

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

4

5 に答える 5

11

ここで苦労しているのは「アプリケーションを正常にシャットダウンする」ことだと思います。それ以外の場合、アプリケーションは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ブール値は揮発性として宣言する必要があります。そうしないと、野心的なオプティマイザによってプログラムが無限にループする可能性があります。

于 2008-10-15T00:08:11.617 に答える
5

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

于 2009-07-05T02:28:52.677 に答える
2

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

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

于 2008-10-14T23:53:54.907 に答える
1

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

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

于 2008-10-14T23:58:18.343 に答える
0

CTRL + f5F5(デバッグ)の代わりにキーボードのキーを押して、デバッグなしでプログラムまたはコードを実行するだけです。

于 2014-04-25T06:35:09.000 に答える