J’ai une application graphique qui doit exécuter des calculs longs (pensez une minute ou plus) et la façon dont elle gère cela consiste à donner le calcul à un ouvrier travaillant à l’arrière-plan. (cette partie est bien)
La question que j’ai est si je fais quelque chose comme: this.backgroundWorker.RunWorkerCompleted + = new System.ComponentModel.RunWorkerCompletedEventHandler (this.doSomethingElse);
doSomethingElse va-t-il être exécuté sur le thread principal de l’interface utilisateur ou dans le pool de threads sur lequel le travailleur d’arrière-plan a été exécuté?
merci pour toute aide que vous pouvez fournir.
Il sera exécuté dans le même thread que BackgroundWorker, c’est-à-dire le plus souvent le thread d’interface utilisateur.
est-ce que quelque chose ne va pas être exécuté sur le fil principal de l’interface utilisateur
Oui, c’est la raison principale d’être pour un Backgroundworker. Il a 3 événements, seul DoWork sera exécuté sur un thread séparé (ThreadPool). Completed et ProgressChanged sera marshalé sur le thread “principal”.
Si BackgroundWorker a été créé à partir du thread d’interface utilisateur, l’événement RunWorkerCompleted sera également déclenché sur le thread d’interface utilisateur.
S’il a été créé à partir d’un thread en arrière-plan, l’événement sera déclenché sur un thread en arrière-plan non défini.
Voir ce post et ce problème de connexion pour plus d’informations.