InvokeRequired dans wpf [dupliquer]

cette question a déjà une réponse ici:

j'ai utilisé cette fonction dans une Windows forms application:

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 ça ne marche pas. Pourquoi?

27
demandé sur Anatoliy Nikolaev 2013-03-19 20:17:35

4 réponses

dans WPF, la méthode Invoke est sur le répartiteur, donc vous devez appeler Dispatcher.Invoke au lieu de Invoke . En outre, il n'y a pas de propriété InvokeRequired , mais le répartiteur a une méthode CheckAccess (pour une raison quelconque, il est caché dans intellisense). Votre code devrait donc ê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();
}
43
répondu Thomas Levesque 2013-03-19 16:21:13

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
répondu JaredPar 2013-03-19 16:19:50

vérifier "151910920 de" Dispatcher.CheckAccess ()

1
répondu TalentTuner 2013-03-19 16:19:23

WPF utilise le Dispatcher pour contrôler l'accès à la pompe de message, plutôt que de demander à chaque commande d'accéder au thread de L'interface utilisateur.

vous devez utiliser Dispatcher.Invoke pour ajouter un délégué au thread de L'UI dans une application WPF.

il est également intéressant de noter que InvokeRequired n'est pas vraiment nécessaire dans une application winform, ni quelque chose que vous devriez vérifier dans une application WPF. Vous devriez savoir que vous n'êtes pas dans le fil UI quand vous appelez Invoke . Vous ne devriez jamais être dans une situation où une méthode donnée est parfois appelée à partir du thread de L'interface utilisateur et parfois à partir d'un thread d'arrière-plan. Choisissez-en un; soit vous forcez toujours l'appelant à invoquer le thread de L'interface utilisateur avant d'appeler une méthode donnée (donc vous n'avez pas besoin d'invoquer), soit vous supposez que l'appelant ne sera pas dans le thread de l'interface utilisateur lorsque la méthode est appelée. Il est également intéressant de noter que l'appel Invoke lorsque vous êtes déjà dans L'UI thread est tout simplement parfait. Il n'y a pas d'erreurs ou de problèmes qui résulteront d'une instance occasionnelle de réinvocation du thread de L'interface utilisateur (il y a un coût de performance très mineur, donc n'ajoutez pas de code inutile partout).

0
répondu Servy 2013-03-19 16:19:15