Wenn ich mehrere Ereignishandler einrichte, wie folgt:
_webservice.RetrieveDataCompleted += ProcessData1;
_webservice.RetrieveDataCompleted += ProcessData2;
In welcher Reihenfolge werden die Handler ausgeführt, wenn das Ereignis RetrieveDataCompleted
ausgelöst wird? Werden sie im selben Thread und nacheinander in der Reihenfolge ausgeführt, in der sie registriert sind?
c#
asynchronous
event-handling
Phillip Ngan
quelle
quelle
Antworten:
Derzeit werden sie in der Reihenfolge ausgeführt, in der sie registriert sind. Dies ist jedoch ein Implementierungsdetail, und ich würde mich nicht darauf verlassen, dass dieses Verhalten in zukünftigen Versionen gleich bleibt, da es von den Spezifikationen nicht verlangt wird.
quelle
Von hier aus: Delegiertenklasse
quelle
add
und mussremove
ein Ereignis nicht unbedingt als Multi-Cast-Delegat implementiert werden.Sie können die Reihenfolge ändern, indem Sie alle Handler abnehmen und dann in der gewünschten Reihenfolge wieder anbringen.
quelle
Die Reihenfolge ist beliebig. Sie können sich nicht darauf verlassen, dass die Handler von einem Aufruf zum nächsten in einer bestimmten Reihenfolge ausgeführt werden.
Bearbeiten: Und auch - es sei denn, dies ist nur aus Neugier - die Tatsache, dass Sie wissen müssen, weist auf ein ernstes Designproblem hin.
quelle
Sie werden in der Reihenfolge ausgeführt, in der sie registriert sind.
RetrieveDataCompleted
ist ein Multicast-Delegierter . Ich schaue durch den Reflektor, um zu überprüfen, und es sieht so aus, als würde hinter den Kulissen ein Array verwendet, um alles im Auge zu behalten.quelle
Wenn jemand dies im Kontext eines System.Windows.Forms.Form tun muss, finden Sie hier ein Beispiel, das die Reihenfolge des angezeigten Ereignisses invertiert.
quelle
Ein MulticastDelegate verfügt über eine verknüpfte Liste von Delegaten, die als Aufrufliste bezeichnet wird und aus einem oder mehreren Elementen besteht. Wenn ein Multicast-Delegat aufgerufen wird, werden die Delegaten in der Aufrufliste synchron in der Reihenfolge aufgerufen, in der sie angezeigt werden. Wenn während der Ausführung der Liste ein Fehler auftritt, wird eine Ausnahme ausgelöst.
quelle
Aber niemand sagt, dass die Aufrufliste die Delegierten in derselben Reihenfolge verwaltet, in der sie hinzugefügt wurden. Somit ist die Aufrufreihenfolge nicht garantiert.
quelle
Dies ist eine Funktion, mit der die neue Ereignishandlerfunktion an einer beliebigen Stelle in der Aufrufliste mit mehreren Registern platziert wird.
Dann können Sie die Funktion jederzeit mit einem '- =' entfernen, wo immer dies in Ihrem Code zweckmäßig ist.
PS - Ich mache keine Fehlerbehandlung für den Parameter 'position'.
quelle
Ich hatte ein ähnliches Problem. In meinem Fall war es sehr einfach zu beheben. Ich hatte noch nie einen Delegierten gesehen, der den Operator + = nicht verwendete. Mein Problem wurde behoben, indem immer ein Delegierter am Ende hinzugefügt wurde, alle anderen immer am Anfang. Das Beispiel des OP wäre ungefähr so:
Im ersten Fall wird ProcessData1 zuletzt aufgerufen. Im zweiten Fall wird ProcessData2 zuerst aufgerufen.
quelle