wenn ein Ereignis mehrere Abonnenten, wie bekomme ich den return-Wert für jeden Abonnenten?
Der code sieht wie folgt aus:
Uhr:
public class Clock
{
public event Func<DateTime, bool> SecondChange;
public void Run()
{
for (var i = 0; i < 20; i++)
{
Thread.Sleep(1000);
if (SecondChange != null)
{
//how do I get return value for each subscriber?
Console.WriteLine(SecondChange(DateTime.Now));
}
}
}
}
DisplayClock:
public class DisplayClock
{
public static bool TimeHasChanged(DateTime now)
{
Console.WriteLine(now.ToShortTimeString() + " Display");
return true;
}
}
LogClock:
public class LogClock
{
public static bool WriteLogEntry(DateTime now)
{
Console.WriteLine(now.ToShortTimeString() + " Log");
return false;
}
}
Um den code auszuführen:
var theClock = new Clock();
theClock.SecondChange += DisplayClock.TimeHasChanged;
theClock.SecondChange += LogClock.WriteLogEntry;
theClock.Run();
Die anderen Fragen sind:
- Ist es gute Praxis für jeden Teilnehmer, um einen Wert zurückzugeben?
- Ist es gute Praxis, nur erklären, Action/Func, wie das Ereignis zurück geben, anstatt manuelles deklarieren eines Delegaten?
InformationsquelleAutor der Frage Jeff | 2009-08-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden
Delegate.GetInvocationList
.Ja. Aber ich will darauf hinweisen, dass die beste Vorgehensweise ist, für die Ereignisse zu verwenden
EventHandler<T>
stattFunc<..., TResult>
.EventHandler<T>
unterstützt keine Werte zurückgeben, aber Sie sind etwas gerechtfertigt, dass es ein paar .NET Ereignisse, die Werte zurückgeben. Ich hielte es für besser, eine einstellbare Eigenschaft in einer benutzerdefiniertenEventArgs
Unterklasse, die Sie als IhreT
. Dies ist das Muster, das wir sehen, in der Dinge wieKeyEventArgs.Handled
. Auf diese Weise können SieEventHandler<T>
und die Abonnenten können auch koordinieren Ihre Antworten in einem begrenzten Umfang durch abrufen und festlegen dieser Eigenschaft.InformationsquelleAutor der Antwort Jason Kresowaty
Ich denke, es ist völlig in Ordnung, zu verwenden, Action/Func anstelle der Stellvertretung.
ABER die Ereignisse sollen nicht verwendet werden, wie, dass.
Sie werden ausgelöst, auf unbestimmte Zeit-Punkt, so dass Sie nur don ' T wissen alle Parameter.
Was Sie wirklich brauchen, ist wahrscheinlich:
So wird der code wie folgt Aussehen:
InformationsquelleAutor der Antwort Dmytrii Nagirniak