メモです。
Process.Exited イベントハンドラの中でフォームのコントロールなどにアクセスしようとすると、InvalidOperationException が発生することがあります(プロパティの取得だけとかだったら大丈夫なことも)。
Exited イベントは「システムのスレッドプールのスレッド」とやらによって呼び出されるらしく、これが操作対象のコントロールを生成したスレッドとは異なるため、例外が発生するらしいです。
Process.SynchronizingObject に対して操作対象のコントロール(を生成したスレッドが生成したオブジェクト)を指定してやれば、Exited イベントはそのスレッドによって呼び出されます。
Process process = new Process();
process.StartInfo.FileName = "c:\hoge.exe";
process.SynchronizingObject = label1 とか this とか;
process.EnableRaisingEvents = true;
process.Exited += new EventHandler(process_Exited);
:
:
private void process_Exited(object sender, EventArgs e) {
label1.Text = "Process has exited.";
}
ちなみに、フォームデザイナで Process のインスタンスを作成した場合は、SynchronizingObject は自動的に設定されるらしいです。
BuySignulair - 2009/09/14 08:22:01 | tj5uryvE | edit
alt of intresting info here. thx