web-dev-qa-db-ja.com

wpfのInvokeRequired

この関数を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では機能しません。どうして?

30
oehgr

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();
}
50
Thomas Levesque

WPFでは、CheckAccessの代わりにInvokeRequiredメソッドを使用します

if (!CheckAccess()) { 
  // On a different thread
  Dispatcher.Invoke(() => log_left_accs(arg));
  return;
}
12
JaredPar
0
TalentTuner