あおいるかの倉庫

admin : new / comments / design / analysis

[.NET] Process.Exitedイベントハンドラからコントロールにアクセスすると例外が発生する

メモです。

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 は自動的に設定されるらしいです。

Comments

BuySignulair - 2009/09/14 08:22:01 | tj5uryvE | edit

alt of intresting info here. thx

Comment Form

name :       pass :
body :
※ URL は ttp:// で始めてください(スパム対策)      secret     

おすすめタグ


すべてのタグ


最近の記事

RSSRSS

アーカイブ


全ての一覧

検索

プロフィール

プロフィール画像

syego

Gmail twitter ニコニコ動画 pixiv

My Profile by iddy

ついったー

[favorited] [more]

PR

FC2Ad

FC2ブログ

スポンサーニュース
  1. 無料アクセス解析