Exited
プロセスの所有者でなくても、イベントを使用できます。このコードは問題なく機能します。
var proc = Process.GetProcessesByName("notepad")[0];
proc.EnableRaisingEvents = true;
proc.Exited += (s, e) => { Console.Write("Done"); };
EnableRaisingEvents
.NET側で発生し、プロセスの作成とは関係ありません。プロセスハンドルが通知されるのを待つことと関係があります。これは、たとえば次のように、任意の待機ハンドル(およびプロセスも待機ハンドル)を使用して実行できます。
var registration
= ThreadPool.RegisterWaitForSingleObject(waitHandle, callbackMethod, null, -1, true);
(スレッドプールからの)別のスレッドを実際に使用しているのは、コールバックの実行中だけです。待っている間、何もせずにスレッドを無駄にする必要はありません。
もちろん、同期プロセスの一部として待機したい場合でも、できればWaitForExit
タイムアウトを使用して、を呼び出すことができます。RegisteredWaitHandle
または、との周りに単純なラッパーを作成することもできますawait
。