Process.Exitedイベントの謎
ってほどのことは無いのですが、ちょっと嵌りました。例えば、電卓を起動させて、一定時間経ったら強制終了させるコードがあったとします。
using System; using System.Diagnostics; class Program { static void Exited(object Sender, EventArgs e) { Console.WriteLine("Exited."); } static void Main(string[] args) { // 3秒でアプリケーションを終了させる int timeout = 3000; Process p = Process.Start("calc.exe"); p.Exited += new EventHandler(Exited); // イベント通知要求を設定し忘れ // p.EnableRaisingEvents = true; p.WaitForInputIdle(); if (!p.WaitForExit(timeout)) { // タイムアウト p.CloseMainWindow(); } // プロセスの終了をチェックする if (p.HasExited) {} } } /* 結果 Exited. */
終了したら「Exited.」というメッセージを表示させるために、Exitedイベントを登録して上記プログラムを実行すると、一見上手く動いているように見えます。しかし、
// プロセスの終了をチェックする // if (p.HasExited) {}
このようにコメントアウトするとExitedイベントが呼び出されなくなってしまいました。まぁ、話は単純で、
// イベント通知要求を設定し忘れ p.EnableRaisingEvents = true;
EnableRaisingEventsを設定し忘れていただけです。ですが、設定し忘れていてもHasExitedやExitCodeにアクセスするとExitedイベントが呼ばれてしまうことに、ちょっと戸惑いました。ヘルプを読む限りはこんな動作をするようには見えないのですが・・・