[.NET] 別スレッドからUIを更新する

threadを並列に動作させて結果をUIに反映する構造のコードを実行すると、
”このオブジェクトは別のスレッドに所有されているため、呼び出しスレッドはこのオブジェクトにアクセスできません”
というメッセージが表示され、オブジェクトを更新できない。

.NETでUIスレッドへのアクセスを確保するやり方は以下のmsdnのエントリにコードサンプル付きで説明されている。

Threading Model ( http://msdn.microsoft.com/en-US/library/ms741870.aspx)

UIエレメントはUIスレッドだけからアクセスできるようになっている。オブジェクトがスレッド単位の排他のための仕組みを持っていてアクセスするスレッドがUIスレッドと異なるとき、エラーを投げる。

ほかのスレッドがUIスレッドを使ってエレメントにアクセスするには、UIスレッドのDispatcher classのBeginInvokeメソッドを使ってアクセスの実行をdelegateする。具体的にはUIスレッドのDispatcherキューにつなぐ。UIスレッドがDispatcherキュー上のイベントを実行することでオブジェクトへのアクセスが可能になる。

MSDNのドキュメントでは、ウィンドウが1つの場合(長い処理でUIが止まるのを防ぐ)やworkerスレッドを使うケースなどを扱っている。

広告

コメントを残す

コメントを投稿するには、以下のいずれかでログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。