Meinen Sie Delegate.Invoke
/ BeginInvoke
o Control.Invoke
/ BeginInvoke
?
Delegate.Invoke
: Wird synchron, auf demselben Thread, ausgeführt.
Delegate.BeginInvoke
: Wird asynchron ausgeführt, auf einer threadpool
Thema.
Control.Invoke
: Wird auf dem UI-Thread ausgeführt, aber der aufrufende Thread wartet auf den Abschluss, bevor er fortfährt.
Control.BeginInvoke
: Wird auf dem UI-Thread ausgeführt, und der aufrufende Thread wartet nicht auf die Fertigstellung.
In Tims Antwort wird erwähnt, wann Sie Folgendes verwenden sollten BeginInvoke
- obwohl sie sich hauptsächlich an Delegate.BeginInvoke
vermute ich.
Für Windows Forms-Anwendungen würde ich vorschlagen, dass Sie in der Regel verwenden. BeginInvoke
. Auf diese Weise müssen Sie sich zum Beispiel keine Sorgen über Deadlocks machen - aber Sie müssen sich darüber im Klaren sein, dass die Benutzeroberfläche möglicherweise noch nicht aktualisiert wurde, wenn Sie sie das nächste Mal betrachten! Insbesondere sollten Sie keine Daten ändern, die der UI-Thread vielleicht gerade für die Anzeige verwenden will. Zum Beispiel, wenn Sie eine Person
con FirstName
y LastName
Eigenschaften, und das haben Sie getan:
person.FirstName = "Kevin"; // person is a shared reference
person.LastName = "Spacey";
control.BeginInvoke(UpdateName);
person.FirstName = "Keyser";
person.LastName = "Soze";
Dann kann es gut sein, dass die Benutzeroberfläche "Keyser Spacey" anzeigt (es besteht eine geringe Chance, dass sie "Kevin Soze" anzeigt, aber nur aufgrund der Seltsamkeiten des Speichermodells).
Es sei denn, Sie haben diese Art von Problem, Control.BeginInvoke
ist einfacher zu bewerkstelligen und verhindert, dass Ihr Hintergrund-Thread ohne Grund warten muss. Beachten Sie, dass das Windows Forms Team garantiert hat, dass Sie Control.BeginInvoke
nach dem "Feuer und Vergessen"-Prinzip, d. h. ohne jemals die EndInvoke
. Dies gilt nicht für asynchrone Aufrufe im Allgemeinen: Normalerweise sollte jeder BeginXXX-Aufruf einen entsprechenden EndXXX-Aufruf haben, normalerweise im Callback.