C#で他のアプリケーションを起動および監視するためのアプリケーションを作成しています。System.Diagnostics.Processクラスを使用してアプリケーションを起動し、Process.Respondingプロパティを使用してアプリケーションを監視して、100ミリ秒ごとにアプリケーションの状態をポーリングしています。Process.CloseMainWindowを使用してアプリケーションを停止するか、Process.Killを使用して、応答しない場合はアプリケーションを強制終了します。
基になるプロセスがループでハングし、CloseMainWindowに応答しない場合でも、プロセスオブジェクトが応答プロパティが常にtrueを返す状態になることがあるという奇妙な動作に気づきました。
これを再現する1つの方法は、プロセスインスタンスを開始した直後にRespondingプロパティをポーリングすることです。だから例えば
_process.Start();
bool responding = _process.Responding;
エラー状態を再現します
_process.Start();
Thread.Sleep(1000);
bool responding = _process.Responding;
動作します。スリープ期間を500に短縮すると、エラー状態が再び発生します。
開始後の_process.Respondingの応答が速すぎると、オブジェクトが適切なWindowsメッセージキューハンドラーを取得できなくなるようです。_process.Startが非同期作業を終了するのを待つ必要があると思います。Thread.Sleepを呼び出すよりも、これを待つためのより良い方法はありますか?1000ミリ秒で常に十分だとは確信していません。