J'ai lu sur les arguments en arrière et en avant sur l'ajout d'une logique à vérifier pour savoir si l'appel doit être utilisé IFF lorsqu'il n'est pas sur le thread d'INTERFACE utilisateur et non pas sur le thread d'INTERFACE utilisateur lui-même. J'ai écrit une classe qui examine le temps d'exécution (via Chronomètre) de différentes méthodes pour obtenir une estimation approximative de l'efficacité d'une méthode plutôt qu'une autre.
Le résultat peut être surprenant pour certains d'entre vous (ces tests ont été exécutés via le Formulaire.Illustré de l'événement):
// notice that we are updating the form's title bar 10,000 times
// directly on the UI thread
TimedAction.Go
(
"Direct on UI Thread",
() =>
{
for (int i = 0; i < 10000; i++)
{
this.Text = "1234567890";
}
}
);
// notice that we are invoking the update of the title bar
// (UI thread -> [invoke] -> UI thread)
TimedAction.Go
(
"Invoke on UI Thread",
() =>
{
this.Invoke
(
new Action
(
() =>
{
for (int i = 0; i < 10000; i++)
{
this.Text = "1234567890";
}
}
)
);
}
);
// the following is invoking each UPDATE on the UI thread from the UI thread
// (10,000 invokes)
TimedAction.Go
(
"Separate Invoke on UI Thread",
() =>
{
for (int i = 0; i < 10000; i++)
{
this.Invoke
(
new Action
(
() =>
{
this.Text = "1234567890";
}
)
);
}
}
);
Les résultats sont comme suit:
- TimedAction::Go()+0 - Debug: [DEBUG] Chronomètre [Direct sur le Thread de l'INTERFACE utilisateur]: 300ms
- TimedAction::Go()+0 - Debug: [DEBUG] Chronomètre [Invoquer sur le Thread de l'INTERFACE utilisateur]: 299ms
- TimedAction::Go()+0 - Debug: [DEBUG] Chronomètre [Les Invoquer sur le Thread de l'INTERFACE utilisateur]: 649ms
Ma conclusion est que vous pouvez appeler à tout moment, indépendamment de savoir si vous êtes sur le thread d'INTERFACE utilisateur ou un thread de travail, sans surcharge importante de la boucle de retour via le message de la pompe. Toutefois, l'exécution de la plupart des travaux SUR le thread de l'INTERFACE utilisateur au lieu de faire de nombreux appels à la thread d'INTERFACE utilisateur (via Invoke()) est avantageux et d'améliorer grandement l'efficacité.