12
votes

Puis-je inverser l'ordre d'un événement de délégué multidiffusion?

Lorsque vous vous abonnez à un événement dans .NET, l'abonnement est ajouté à un délégué de multidiffusion. Lorsque l'événement est tiré, les délégués sont appelés dans l'ordre dans lequel ils étaient souscrits.

J'aimerais remplacer l'abonnement, de sorte que les abonnements soient effectivement tirés dans la commande forte> inverse forte>. Peut-on être fait et comment? P>

Je pense que quelque chose comme ça pourrait être ce dont j'ai besoin?: P>

public event MyReversedEvent
{
    add { /* magic! */ }
    remove { /* magic! */ }
}


5 commentaires

Je pensais que l'ordre des abonnements a été licencié était indéterminé.


@ChRISF: de MSDN ... "Un MulticastDelegate a une liste liée des délégués, appelée liste d'invocation, composée d'un ou plusieurs éléments. Lorsqu'un délégué multidiffusion est invoqué, les délégués de la liste d'invocation sont appelés synchroneusement dans l'ordre qu'ils apparaissent. "


@ROBERT - Ah, j'ai clairement glacé sur la multidiffusion MultiCast Temps de temps pour arrêter de rechercher des questions pour répondre et aller au lit.


Puis-je demander pourquoi? Cela n'a pas beaucoup de sens pour moi. Cela ne crée-t-il pas une logique étroite entre l'éditeur et les abonnés, qui est la chose exacte que ce modèle est destiné à éviter?


Bien que vous puissiez trouver des moyens de le faire. J'aimerais toujours connaître la raison pour laquelle vous devez faire cela !!! À ma compréhension, l'ordre dans lequel les événements sont traités par divers objets ne devraient pas être basés sur aucune commande et ne devrait être basé sur aucune logique.


3 Réponses :


5
votes

Une option serait de gérer cela lorsque vous soulevez l'événement. Vous pouvez obtenir les abonnés d'événements via déléguée.getinVocationList et appelez simplement chaque délégué dans l'ordre inverse vous-même.


2 commentaires

Merci - je me suis essayé moi-même juste avant de poster votre réponse et de le faire fonctionner - bien de voir la confirmation que j'ai fait la bonne chose. :)


@Slaks: intéressant. Merci - n'avait pas utilisé les opérateurs de délégués de cette façon avant ...



6
votes

Contrôler quand et si un délégué déclenche dans un délégué de multidiffusion

La méthode suivante crée un délégué de multidiffusion appelé AllInstances, puis Utilise GetInvocactList pour permettre à chaque délégué d'être tiré individuellement, dans l'ordre inverse: xxx


1 commentaires

Merci - je me suis essayé moi-même juste avant de poster votre réponse et de le faire fonctionner - bien de voir la confirmation que j'ai fait la bonne chose. :)



19
votes

Vous n'avez pas besoin de magie; Vous avez juste besoin d'inverser l'addition.
Écrire Délégué1 + Délégate2 renvoie un nouveau délégué contenant la méthode (s) de la méthode (s) dans Délégué1 suivie des méthodes dans Délégate2 .

Par exemple: xxx

Vous n'avez pas besoin de magie dans le gestionnaire Supprimer , sauf si vous souhaitez supprimer la dernière occurrence de ce gestionnaire au lieu du premier. (Si le même gestionnaire a été ajouté deux fois)


2 commentaires

Pouvez-vous développer un peu votre réponse, s'il vous plaît? Il serait bon de voir le contexte autour du code que vous avez posté afin que je puisse voir où je devrais le mettre.


@Neil, quelques informations de base ici: Gavaghan.org/blog/2007/07/25/...