sur quel fil le gestionnaire d’événements terminé par backgroundworker est-il exécuté?

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.

https://stackoverflow.com/a/2806824/279999

http://connect.microsoft.com/VisualStudio/feedback/details/116930/backgroundworker-components-progresschanged-and-runworkercompleted-event-run-on-wrong-thread