Dans la dernière question Afficher la barre de progression tout en travaillant en C #? , les gens ont recommandé l’utilisation de BackgroundWorker
. J’ai pensé que dans la méthode BackgroundWorker
DoWork, vous pouvez mettre à jour l’interface graphique directement, mais pourquoi cet appel de fonction doit être appelé à l’aide de Invoke
.
toolTip.SetToolTip(button, toolTipText);
Le rappel RunWorkerCompleted
est organisé sur le thread d’interface utilisateur; DoWork
n’est pas.
Vous devez utiliser la méthode ReportProgress
pour mettre à jour l’interface utilisateur lors DoWork
traitement de DoWork
.
Voir: Comment: exécuter une opération en arrière-plan
Vous vous trompez, vous ne pouvez pas appeler le thread d’interface utilisateur directement à partir du gestionnaire de la méthode DoWork, car il s’agit du thread d’arrière-plan.
Si vous souhaitez mettre à jour l’interface utilisateur, vous devez appeler la méthode ReportProgress, puis mettre à jour l’interface utilisateur à partir du gestionnaire d’événements pour l’événement ProgressChanged.
Bien que vous puissiez appeler la méthode Invoke dans le fil d’arrière-plan, vous empêchez l’utilisation de la classe BackgroundWorker. L’événement ProgressChanged est levé sur le thread d’interface utilisateur et constitue le mécanisme à utiliser pour mettre à jour les composants d’interface utilisateur lorsque quelque chose change sur le thread d’arrière-plan.
N’oubliez pas que si vous appelez RunWorkerAsync () à partir d’un thread autre que l’interface utilisateur, vous devrez appeler Invoke à partir des gestionnaires d’événements ProgressChanged et RunWorkerCompleted.