lorsqu'un événement a plusieurs abonnés, comment puis-je obtenir la valeur de retour pour chaque abonné?
Ressemble le code ci-dessous:
Horloge:
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;
}
}
Pour exécuter le code:
var theClock = new Clock();
theClock.SecondChange += DisplayClock.TimeHasChanged;
theClock.SecondChange += LogClock.WriteLogEntry;
theClock.Run();
Les autres questions sont les suivantes:
- Est-il de bonnes pratiques pour chaque abonné pour renvoyer une valeur?
- Est-il une bonne pratique il suffit de déclarer l'Action/Func, comme l'événement le type de retour au lieu de saisir manuellement déclare un délégué?
Vous devez vous connecter pour publier un commentaire.
Utilisation
Delegate.GetInvocationList
.Oui. Mais je ferai remarquer que la meilleure pratique consiste pour les événements d'utiliser
EventHandler<T>
au lieu deFunc<..., TResult>
.EventHandler<T>
ne prend pas en charge les valeurs de retour, mais vous êtes un peu justifié qu'il y a quelques .NET événements qui ont les valeurs de retour. Je pense qu'il serait mieux d'avoir un réglable propriété personnalisé dans unEventArgs
sous-classe que vous utilisez comme votreT
. C'est le modèle que nous voyons dans des choses commeKeyEventArgs.Handled
. De cette façon, vous pouvez utiliserEventHandler<T>
et les abonnés peuvent également coordonner leurs réponses dans une mesure limitée par l'obtention et la définition de cette propriété.Je pense qu'il est parfaitement possible d'utiliser de l'Action/Func au lieu de la déléguer.
MAIS les Événements ne sont pas censé être utilisé comme ça.
Ils sont déclenchés à durée indéterminée point, de sorte que vous ne connaissez pas tous les paramètres.
Ce que vous avez vraiment besoin est probablement:
Ainsi, le code ressemblera à: