別スレッドからWinForm上のコントロールを操作する場合の注意(.net Fx 2.0)

Formオブジェクトを含め、WinFormsの各コントロールはスレッドセーフではないので、本来別スレッドからの操作には対応できないはずだが、.net Fx 1.1まではこの辺がゆるく、別スレッドからForm上にあるコントロールのプロパティ等を操作できてしまう。だが、.net Fx 2.0からはこの辺が厳しくなり、ランタイムがちゃんとExceptionを投げてくるように変更されている。
だから、Form自身のスレッドではないスレッドからForm上のコントロールを操作したい場合には、FormのインスタンスまたはコントロールのインスタンスのInvokeメソッドを使用してdelegate経由でコントロールを操作しなくてはならない。
あーめんどうくさ。とは言ってもこれが正しい方法なんである。
大まかな手順としては、Formクラス内でコントロール操作用デリゲートを定義
別スレッドで動かすメソッド(もしくはクラスのコンストラクタ)の引数にFormオブジェクト自体の参照かコントロールへの参照を追加する。
Form上のコントロールを呼び出すときにそのコントロールのInvokeメソッドを呼び出すように記述。


追記:
そうさはまったさぁ。こんな事書いてるのも今回が2回目さ。
サンプル。

VS 2005 Beta2で作成しております。
この記事の趣旨としてはわかりにくいサンプルかも
サンプルの内容が、むしろRemotingのサンプルじゃないかといらないつっこみはしないでね。
あー根本的に間違ってるとか、こここうした方が良いとかはもちろん大歓迎です。
サンプルでは毎回デリゲートのインスタンスを作っているけど、そうしない方が良いかも。。

コメントを残す