背景
業務で明示的にUIを更新しないといけない場面があり、以下のコードをコピペして解決できたが、具体的にどういう操作をしてるのか分からなかったので調べてみた
/// <summary>
/// Viewの更新
/// </summary>
public void UpdataView()
{
DispatcherFrame frame = new DispatcherFrame();
var callback = new DispatcherOperationCallback(obj =>
{
((DispatcherFrame)obj).Continue = false;
return null;
});
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, callback, frame);
Dispatcher.PushFrame(frame);
}
この記事の要約
- Dispatcherとは、UIを操作するための仕組み
- DispatcherFrameとは、UIのタスクを実行するループ(実行ループ)を表すクラス
- BeginInvokeメソッドは、実行ループでのUI処理の順番を指定する
- PushFrameメソッドは、実行ループを開始する
本文
Dispatcherとは
大田一希さんの「WPF 4.5入門」によると、Dispatcherとは、UIを操作するための仕組みらしい
WPF では、他の UI フレームワークと同様に UI を操作するには専用のスレッドから操作をする必要があります。
WPF では、この操作を簡単にするために Dispatcher という仕組みを提供しています
参考サイト:
DispatcherFrameとは
- BeginInvokeメソッドで指定する処理を行うための枠(frame)のこと
- この枠を実行ループとMSDNでは呼ばれている
- 実行ループは、Continueプロパティがtrueの間、実行され続ける
参考サイト:
BeginInvokeとは
概要
MSDNによると以下の通りである。
Dispatcher が関連付けられているスレッドで、指定した引数を使用して、指定したデリゲートを指定した優先順位で非同期的に実行します。
書式
BeginInvokeメソッドの書式は以下の通りである。
public System.Windows.Threading.DispatcherOperation BeginInvoke (System.Windows.Threading.DispatcherPriority priority, Delegate method, object arg);
引数
- priority
- 指定したデリゲート(メソッドを代理で呼び出すための型)の優先順位
- 優先順位の指定は DispatcherPriority Enum (System.Windows.Threading) | Microsoft Learn を参照
- method
- デリゲート
- arg
- 指定されたメソッドに引数として渡すオブジェクト
参考サイト:
PushFrameとは
- 引数で指定した実行ループを開始する
参考サイト:
結論
はじめに記載したコードでは、実行可能状態にあるUIのタスクをすべて処理した後、実行ループを抜ける処理を行っていた