Ich bin auf das gestoßen, was ein allgemeines Problem sein muss. Wenn ich ein Ereignis habe, das von mehreren verschiedenen Klassen abonniert werden kann, führt eine Ausnahme, die von einer dieser Klassen ausgelöst wird, zum Abbruch der Rückrufkette. Da ich a priori nicht weiß, in welcher Reihenfolge der Callback ausgeführt wird, kann dies zu unvorhersehbaren Statusänderungen für einige Klassen und nicht für andere führen.
In der Bibel ( CLR über C # verwende ich C # 2.0) dort ist ein kurzer Abschnitt über die Verwendung von MulticastDelegate.GetInvocationList
, um dies zu umgehen, aber nicht mehr. Also meine Frage ist: Was ist der beste Weg, damit umzugehen? Muss ich MulticastDelegate.GetInvocationList
jedes Mal verwenden, wenn ich ein Event habe? Oder muss ich alle Methoden einschließen, die als Teil der Delegiertenkette in einer Art Rollback-Mechanismus aufgerufen werden können? Warum sind all diese Optionen im Vergleich zum einfachen Event / Delegate-Modell, das in C # so einfach zu verwenden ist, so kompliziert? Und wie kann ich den einfachen Weg benutzen, ohne mit einem beschädigten Zustand zu enden?
Danke!
Wenn Sie einfach einen Delegaten aufrufen, werden alle Zielmethoden in der richtigen Reihenfolge aufgerufen. Sie müssen GetInvocationList
verwenden, wenn Sie sie einzeln ausführen möchten, zum Beispiel:
Cancel
nach jedem Was die beste Art der Verwendung betrifft: Wie wollen Sie sich verhalten? Es ist mir nicht klar ... zum Beispiel könnte das für eine Erweiterungsmethode ganz gut geeignet sein:
%Vor% Dann kannst du einfach myHandler.InvokeIgnoreErrors(this);
(zum Beispiel) aufrufen.
Ein anderes Beispiel könnte sein:
%Vor%stoppt, nachdem das erste Ereignis eine Stornierung angefordert hat.
Anstatt zu ändern, wie Sie Ereignisse aufrufen, sollten Sie Ihre Ereignisbehandlungsroutinen überprüfen. Meiner Meinung nach sollten Event-Handler-Methoden immer so geschrieben werden, dass sie "sicher" sind und niemals Ausnahmen propagieren lassen. Dies ist besonders wichtig, wenn Sie Ereignisse in GUI-Code behandeln, bei denen das Ereignis durch externen Code aufgerufen wird, aber zu jeder Zeit eine gute Gewohnheit ist.
Tags und Links c# exception-handling exception delegates