この関数をWindows forms
アプリケーションで使用しました。
delegate void ParametrizedMethodInvoker5(int arg);
private void log_left_accs(int arg)
{
if (InvokeRequired)
{
Invoke(new ParametrizedMethodInvoker5(log_left_accs), arg);
return;
}
label2.Text = arg.ToString();
}
しかし、WPF
では機能しません。どうして?
WPFでは、Invoke
メソッドはディスパッチャー上にあるため、Invoke
の代わりにDispatcher.Invoke
を呼び出す必要があります。また、InvokeRequired
プロパティはありませんが、ディスパッチャーにはCheckAccess
メソッドがあります(何らかの理由で、インテリセンスに隠されています)。したがって、コードは次のようになります。
delegate void ParametrizedMethodInvoker5(int arg);
void log_left_accs(int arg)
{
if (!Dispatcher.CheckAccess()) // CheckAccess returns true if you're on the dispatcher thread
{
Dispatcher.Invoke(new ParametrizedMethodInvoker5(log_left_accs), arg);
return;
}
label2.Text= arg.ToString();
}
WPFでは、CheckAccess
の代わりにInvokeRequired
メソッドを使用します
if (!CheckAccess()) {
// On a different thread
Dispatcher.Invoke(() => log_left_accs(arg));
return;
}