2018年4月8日日曜日

処理がメインスレッドで実行されているか判定する(CheckAccess)

画面に関する処理などはメインスレッドで実施する必要があります。
処理によっては、メインスレッドで実施されているかどうか判定が必要となります。

メインスレッドかどうかの判定には
Application.Current.Dispatcher.CheckAccess()
を使用します。
CheckAccess()はメインスレッドの場合にTrueを返します。


using System.Windows;

private void Execute()
{
 // メインスレッドから実行
 bool checkAccessA = Application.Current.Dispatcher.CheckAccess();

 Debug.WriteLine("メインスレッド [" + checkAccessA + "]");

 // タスク内で実行
 Task.Run(() =>
 {
  bool checkAccessB = Application.Current.Dispatcher.CheckAccess();

  Debug.WriteLine("別スレッド [" + checkAccessB + "]");
 });
}


このプログラムの実行結果は

メインスレッド [True]
別スレッド [False]

のようになります。

WPFでLivetを使用しているなら、
DispatcherHelper.UIDispatcherを使用できるので、あまり出番はないかもしれませんが・・・