Hi,
danke für die Informationen!
Eine kurze Frage hätte ich aber schon: Kann man dasselbe nicht auch mit Semaphoren leisten?
Grüße!
Alles anzeigen
Nein. So wie ich das interpretiere, geht es um das "Reservieren und Freigeben" in C# wäre das mit dem lock keyword durchzuführen. Es schließt einen gewissen Codeblock ein und Reserviert ihn. Als Beispiel könntest du eine Liste mit Threads halten, diese lässt du nun alle auf eine Queue los. Früher oder später wird das knallen (eher früher). Warum? Weil die Threads nicht gleichzeitig Adden können. Verwendet man nun das "Reservieren" wird der Codeblock mit dem ein Thread gerade beschäftigt ist, gesperrt und zwar solange, bis dieser an das ende des Codeblocks gelangt. Die anderen Threads warten derweil.
Hier geht es aber darum GUI Operationen auszuführen. Hier muss nichts reserviert werden (Es sei denn man lässt 2 Threads auf die UI los, das ist aber mehr als dämlich). Es geht hier darum, dass der Thread das Control nicht "bearbeiten" darf, weil er es nicht erstellt hat. Er ist also nicht der "Besitzer" des Controls. Ein Invoke sagt dem GUI Thread nun, dass er die entsprechende Operation ausführen soll, weil der Work Thread das nicht darf.
Und jetzt mal ganz allgemein: Ein Invoke ist auch nicht immer extrem ratsam. Das kostet. Und das ist bei größeren Anwendungen nicht unerheblich. Das kommt eher aus der C++ ecke. Normalerweise verwendet man dafür den Backgroundworker und aktualisiert GUI Felder im Progress Changed Ereignis.