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?
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();
}
dans WPF utilisez la méthode CheckAccess
au lieu de InvokeRequired
if (!CheckAccess()) {
// On a different thread
Dispatcher.Invoke(() => log_left_accs(arg));
return;
}
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).