2010-11-18 3 views
9

Ich habe eine GUI-Anwendung, die lange Berechnungen ausführen muss (denke eine Minute oder mehr) und die Art, wie es damit umgeht, ist, die Berechnung einem Hintergrundarbeiter zu geben. (Dieser Teil ist in Ordnung)welcher Thread beendet der Hintergrundarbeiter den Event-Handler?

Die Frage, die ich habe, ist, wenn ich so etwas wie: this.backgroundWorker.RunWorkerCompleted + = new System.ComponentModel.RunWorkerCompletedEventHandler (this.doSomethingElse);

wird doSomethingElse auf dem Haupt-UI-Thread oder was auch immer in dem Thread-Pool laufen, auf dem der Hintergrund-Worker lief?

danke für jede Hilfe, die Sie zur Verfügung stellen können.

+1

Sie konnten die 'System.Threading.Thread.CurrentThread.ManagedThreadId' in das Ausgabefenster in der' UI', 'DoWork' und' WorkCompleted' schreiben – PostMan

Antwort

6

Es wird in demselben Thread ausgeführt, in dem sich BackgroundWorker befindet, dh normalerweise der UI-Thread.

+0

Ok zu bestätigen der zweite Teil, aber ein Bgw (oder irgendein anderes Objekt) ist nicht "in einem Thread". –

+1

Entschuldigung, der Thread, der sie hervorgebracht hat, wäre eine bessere Formulierung gewesen. – Homde

+0

Das bringt einen interessanten Punkt heraus. Wenn Sie den visuellen GUI-Designer in einer Windows Forms-Anwendung verwenden, um einen BackgroundWorker zu deklarieren, landet das eigentliche BackgroundWorker-Objekt auf dem Stack für den UI-Thread oder auf dem Heap? –

5

ist doSomethingElse auf dem Haupt-UI-Thread

Ja zu laufen gehen, das ist der Hauptgrund für eine Backgroundworker des Seins. Es hat 3 Ereignisse, nur DoWork wird auf einem separaten (ThreadPool) -Thread ausgeführt. Completed und ProgressChanged werden zum Hauptthread gemarshallt.

4

Wenn der BackgroundWorker aus dem UI-Thread erstellt wurde, wird das RunWorkerCompleted-Ereignis auch im UI-Thread ausgelöst.

Wenn es aus einem Hintergrundthread erstellt wurde, wird das Ereignis in einem undefinierten Hintergrundthread ausgelöst.

Weitere Informationen finden Sie in diesem Post und diesem Verbindungsproblem.

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

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

+0

In der Tat! Das erste Mal war ich verwirrt, als meine Anwendung funktionierte, und das Completed-Ereignis wurde vom Haupt-UI-Thread aufgerufen. Aber meine Komponententests sind fehlgeschlagen, soweit das Completed-Ereignis vom Hintergrund-Thread und nicht vom Haupt-Test-Thread aufgerufen wurde –

Verwandte Themen