Renvoyer une valeur à partir d'un Événement est — il une Bonne Pratique pour cela?
Je suis en train de faire un petit multi-thread application qui utilise asynchrone sockets TCP, mais je vais aller droit au but: je suis en utilisant un événement personnalisé pour lire une valeur à partir d'un formulaire et le délégué utilisé par l'événement renvoie une chaîne lorsque vous avez terminé.
Ma question ici est: est-ce exact? est-il OK pour les valeurs de retour de ces événements? ou est-il une meilleure façon de le faire? (comme l'utilisation d'un simple délégué à l'écran pour lire les valeurs)
Vous devez vous connecter pour publier un commentaire.
Il est souvent maladroit pour les valeurs de retour des événements. Dans la pratique, je l'ai trouvé beaucoup plus facile d'inclure une écriture de la propriété sur un ensemble de coutume EventArgs qui est transmis à l'événement, puis vérifier après l'événement se déclenche -- semblable à Annuler propriété de la WinForms FormClosing événement.
include a writable property on a set of custom EventArgs that is passed to the event
partie?Je ne pense pas que c'est une bonne idée... les événements sont essentiellement de multidiffusion délégués, donc il peut y avoir plusieurs gestionnaires. Qui de valeur de retour va vous prendre dans ce cas ?
Le plus proche de l'exemple que je peux penser est la FormClosing événement en WinForms. Il permet la forme d'annuler l'événement par la mise en eventArgs.Annuler true à la propriété. Pour vous de faire quelque chose de similaire, vous définissez votre propre événement args classe avec la valeur de retour comme une propriété de classe. Puis passer un événement args objet chaque fois que vous déclenchez l'événement. Celui qui a déclenché l'événement peut inspecter l'événement args objet pour la valeur de retour. D'autres qui sont de la réception de l'événement peut également inspecter ou de modifier l'événement args objet.
Mise à jour: j'ai juste couru à travers le Domaine d'application.AssemblyResolve événement, et il semble être un événement qui retourne une valeur. Il semble que vous avez juste besoin de déclarer un type délégué qui retourne une valeur, puis définir votre événement avec ce type de délégué. Je n'ai pas essayé de créer mon propre événement comme celui-ci, cependant. Un avantage de l'utilisation d'un bien sur le cas de l'argument est que tous les abonnés à l'événement peut voir ce que les abonnés sont de retour.
public event Func<string, string, bool> SomeEvent;
qui serait exigible en tant quebool r = SomeEvent("foo", "bar");
Je sais que c'est âges, après le post, mais la pensée de l'ajout de commentaire avec un code pour expliquer Dustin Campbell réponse si quelqu'un tombe sur ce fil. Je suis tombé sur ce post en essayant de décider ce qui serait le mieux à la pratique et c'est ce qui est signifié par la réponse.
Créer votre propre gestionnaire d'événement de la classe
Ainsi, lorsque vous créez votre délégué d'événement que vous utilisez votre événement créé des arguments de ce genre.
Et dans la classe déclenche l'événement vous déclarer l'événement.
Ainsi, lorsque vous déclenchez l'événement dans votre classe de la classe qui est à l'écoute de l'événement, vous pouvez simplement dans le corps de l'événement e.DoOverride = true; comme elle est déclarée dans la classe de tir à l'événement.
Feu par exemple:
myCustomeEvent(...)
fera passer le contrôle (exécuter sur le même thread) à tous les abonnés de gestionnaires d'événements. Une fois la totalité de leur code a été exécuté, puis sera de retour à l'instruction juste après l'appel àmyCusomeEvent(...)
. Si il n'y a pas d'abonnés, ou il y a des abonnés qui retransmettent l'événement sur un autre fil, puis toutes les propriétés sur leeventArgs
ont leur valeur par défaut (false pour lebool
etnull
pour les cordes).Remarque: seul le dernier événement renvoie le résultat.
Je ne sais pas si c'est la meilleure pratique, mais j'ai fait de cette façon.
Si l'événement renvoie une valeur et il y a de multiples gestionnaires inscrits à l'événement renvoie la valeur du résultat de la dernière appelée gestionnaire.
Chercher un exemple à http://blogs.msdn.com/b/deviations/archive/2008/11/27/event-handlers-returning-values.aspx
J'ai bouclé les propriétés de la EventArgs comme ça et en tira ses valeurs X et Y.
private void navBarControl1_Click(object sender, EventArgs e)
{
int _x = 0;
int _y = 0;