BackgroundWorker doit toujours appeler Invoke?

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.