Wie kann ich Ausnahmen stoppen, die meine Delegiertenkette zerstören?

8

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!

    
Joel in Gö 12.01.2009, 09:12
quelle

2 Antworten

11

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:

  • überprüft Cancel nach jedem
  • um den Rückgabewert jedes
  • zu erfassen
  • um nach dem Ausfall eines einzelnen Ziels fortzufahren

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.

    
Marc Gravell 12.01.2009, 09:19
quelle
1

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.

    
Helen Toomik 12.01.2009 11:12
quelle