子煩悩のブログ

妻と娘と息子とプログラミングが好きなパパの雑記

DispatcherObjectクラス

○特徴

・objectからひとつ派生したクラス

・Dispatcherに関連づけられているオブジェクト

・Dispatcherはスレッドの作業項目キューの管理サービス

 

○推測

DispatcherはSystem.Windows.Threading名前空間に存在しており、普段全く意識せず使える事からプログラム実行時に裏でスレッド毎に生成されていると思われる。

DispatcherObjectはメソッドを実行するスレッドを切り替えた際に不都合が起きない仕組みを持ったオブジェクトなのではないかと思われる。

 

○調べたらどうだったか

DispatcherObjectにはDispatcherが作成されたスレッドのみが直接アクセスできる。

InvokeメソッドでUIスレッドを呼び出す事が多々なので、Dispatcherって UIスレッドにしか存在しないの?と思って調べたら、Dispatcherを最低一つ持つ事が UIスレッドの条件だった。

DispatcherObjectにはVerifyAccessメソッドでどこのDispatcherと結びついているのかを確認する事ができる。これは要するに迷子防止機能なんだと思う。

Dispatcher.BeginInvoke()メソッドなんかはDispatcherObjectを入れるだけで勝手にスレッドアクセス方法なんかを考えずに元々居たUIスレッドへと誘う優れものなんだろうと思われる

 

○解釈

実務的にはDispatcherObjectはいつでも元いた UIスレッドへの移動が可能な迷子防止機能のついたObjectって理解で良さそう。

 UIスレッドで実行する時にDispatcher側は同期、非同期を選択できるメソッドを用意していて相互関係でスレッドの詳細を意識しなくてもプログラムが動く仕組みになっているんだと思う。

これらがないと全部のコントロールのマルチスレッドでのコーディングが死ぬほどめんどくさくなるのでObjectから一個派生した所っていうキモの位置に定義されたのだと思われる

 

余談

MVVMのようなGUIとロジックが切り離されたコードの場合、Model側はViewが所有するDispatcherを知らないと元々何スレッドで動いていた処理が流れてきているのか分かったものではないのでModel側の基底クラスにはViewのDispatcherと同じものが用意されているはず。

なので調べてみる。