web-dev-qa-db-fra.com

InvokeRequired dans wpf

J'ai utilisé cette fonction dans une application 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();
}

Mais dans WPF cela ne fonctionne pas. Pourquoi?

28
oehgr

Dans WPF, la méthode Invoke est affichée sur le répartiteur. Vous devez donc appeler Dispatcher.Invoke au lieu de Invoke. De plus, il n'y a pas de propriété InvokeRequired, mais le répartiteur a une méthode CheckAccess (pour une raison quelconque, elle est cachée dans intellisense). Donc, votre code devrait être:

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

Dans WPF, utilisez la méthode CheckAccess au lieu de InvokeRequired

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