Laden...

Multicast-Delegat mit Rückgabewert: Wie das Überschreiben von Ergebnissen verhindern?

Erstellt von Wax vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.262 Views
Wax Themenstarter:in
731 Beiträge seit 2006
vor 11 Jahren
Multicast-Delegat mit Rückgabewert: Wie das Überschreiben von Ergebnissen verhindern?

Hallo zusammen,

ich bin in einem unserer Projekte gerade auf folgenden Code gestoßen:


public delegate bool MyDelegate(Control page1, Control page2);
...
public event MyDelegate ValidateQuantity;
...


var valid = true;
var handler = ValidateQuantity;
if (handler != null) {
    valid = handler(page1, page2);
}
return valid;


Das kann/darf man doch so nicht schreiben, oder? Man weiß doch überhaupt nicht wieviele Handler sich registriert haben und von daher überschreibt wohlmöglich ein Handler-Rückgabewert einen anderen. Oder sehe ich das falsch?

MfG
wax

6.911 Beiträge seit 2009
vor 11 Jahren

Hallo Wax,

das siehst du schon richtig. Wenns wie hier um den Rückgabewert geht*, so sollten die Delegaten in einer Schleife abgearbeitet werden. Mittels GetInvocationList kannst du dir die Delegaten holen und dann abarbeiten.

* ich würde das nicht per Event lösen, sondern per normalen Methoden-Aufruf um z.B. genau dieses Problem von vornherein zu vermeiden

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo Wax,

im Framework wird denn auch bei Events (die ja per se die Möglichkeit von Mulitcasts in Betracht ziehen / ziehen müssen) statt eines Rückgabewerts eine Property in den EventArgs verwendet, z.B. CancelEventArgs.Cancel.

Aber auch da kommt es auf die Kooperationsbereitschaft der EventHandler an, damit die sich den Wert nicht gegenseitig überschreiben. Also z.B. ein EventHandler nicht einfach am Anfang Cancel auf false "initialisiert" und damit möglicherweise das schon gesetzte true eines anderen EventHandlers überschreibt.

Erschwerend kommt hinzu, dass die Reihenfolge der Abarbeitung der EventHandler nicht definiert/spezifiziert ist ... und selbst wenn sie es wäre, sollte man von der Reihenfolge nichts abhängig machen.

Wenn das event-auslösende Objekt die Kontrolle darüber behalten will, welches der Ergebnisse der einzelnen EventHandler gewinnt bzw. wie die Teilergebnisse zu einem Gesamtergebnis zusammengefasst werden und man das nicht der Kooperation der EventHandler überlassen will, könnte man entsprechenden Code in den Setter der Property in den EventArgs einfügen. Oder man verwendet eine Methode (die den Wert als Parameter bekommt) statt einer Property, damit klarer wird, dass noch eine Logik dahinter steckt.

herbivore

3.170 Beiträge seit 2006
vor 11 Jahren

Hallo,

schau Dir auch mal Multicast-Delegaten: Auswertung aller Rückgabewerte und Abbruchmöglichkeit an. Damit kommt man an alle Rückgabewerte aller registrierten Handler, und auch an die entsprechenden Handler die die Werte zurückgeben.

Ist für Deinen Fall nur möglicherweise eine Lösung, in diesem Zusammenhang aber zumindest interessant.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca