0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Dispatcherを用いてUIを明示的に更新する

Last updated at Posted at 2023-11-18

背景

業務で明示的に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);

引数

参考サイト:

PushFrameとは

  • 引数で指定した実行ループを開始する

参考サイト:

結論

はじめに記載したコードでは、実行可能状態にあるUIのタスクをすべて処理した後、実行ループを抜ける処理を行っていた

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?