CancelKeyPressイベントが発生するまでコンソールを開いたままにするにはどうすればよいですか?
質問
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 のキーボードキーで、デバッグせずにプログラムまたはコードを実行するだけです。