【C#】別スレッドからUIの画像を更新する

【C#】別スレッドからUIの画像を更新する

別スレッドを使って画像処理を行い、処理後のビットマップをUIのImageコントロールに反映する処理を作成した。

 

UIスレッドとは別のスレッドからImage.Sourceを更新するには、Dispatcher.BeginInvokeあるいはDispatcher.Invokeを使用すればいいらしいのでやってみた!

 

ダメな例

まずはこんな感じでimageコントロールにbitmapをアタッチしている部分を単純にBeginInvokeで囲ってみた。

そうすると、例外は発生しないものの画像が全く表示されない。

 

原因と対策

この原因はおそらく、imageコントロールの描画処理はUIスレッドで動くのに対し、そこに渡したいbitmapは別スレッドにあるものだからだと思う。

ググってみると、Freezeメソッドを使用することで別スレッドからbitmapを使えるようになるらしい。

 

Freezable Objects Overview / Microsoft Docs

 

ここを見ると、

Thread safety: a frozen Freezable can be shared across threads.

と書いてある。Freezeされたオブジェクトはスレッド間で共有できるということ。

だからbitmapをFreeze()してやるとUIスレッドへ共有できるわけね。

 

bitmapをFreezeしてみる

 

こうすることで、問題なくimageコントロールへbitmapを表示することができた。

 

非同期の処理にするとスレッド間のやりとりとか、いろいろ考える事が増えて大変ですなぁー

C#カテゴリの最新記事