子煩悩のブログ

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

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と同じものが用意されているはず。

なので調べてみる。

 

はじめに

かわいい妻と息子と娘を持つ父ちゃんやってます。

 

最近プログラミングを子育てしながらもっと楽しもうという意欲が湧いています。

きっかけは牛尾剛さんの世界一流エンジニアの思考法を読んだことでした。著書の中で少し調べて解決できるレベルの知識を即興で解決できるレベルに落としこむとパフォーマンスが上がる旨の記述がありました。なのでGoogle検索でわかるレベルのコードや基礎だけど深く知ろうとしなかった知識をはてなブログを使ってまとめ直すことで理解を深めようと考えています。

 

私は普段WPFを利用してコーディングしています。GUIXAML、ロジックをC#で記述しています。システムモデルはMVVMを採用しています。GUIとロジックが異なる言語であるためデータ結合にBinding機能を用いているのですが理解が浅いため頻繁にGoogle先生や参考書のお世話になっています。

 

ですので当面は上述の点についてまとめ記事を書いていく予定です。

 

Unityでスマホアプリの開発もしたいなと思う今日この頃ですので気が向いたらそちらにゼロから着手した記事も書いていきたいと思います。