Si je configure plusieurs gestionnaires d'événements, comme ceci:
_webservice.RetrieveDataCompleted += ProcessData1;
_webservice.RetrieveDataCompleted += ProcessData2;
dans quel ordre les gestionnaires sont-ils exécutés lorsque l'événement RetrieveDataCompleted
est déclenché? Sont-ils exécutés dans le même thread et séquentiellement dans l'ordre d'enregistrement?
c#
asynchronous
event-handling
Phillip Ngan
la source
la source
Réponses:
Actuellement, ils sont exécutés dans l'ordre dans lequel ils sont enregistrés. Cependant, il s'agit d'un détail d'implémentation, et je ne me fierais pas à ce que ce comportement reste le même dans les versions futures, car il n'est pas requis par les spécifications.
la source
De là: Classe des délégués
la source
add
-remove
clés et, un événement ne peut pas nécessairement être implémenté en tant que délégué multi-cast.Vous pouvez modifier l'ordre en détachant tous les gestionnaires, puis en les rattachant dans l'ordre souhaité.
la source
L'ordre est arbitraire. Vous ne pouvez pas compter sur l'exécution des gestionnaires dans un ordre particulier d'une invocation à l'autre.
Edit: Et aussi - à moins que ce ne soit juste par curiosité - le fait que vous ayez besoin de savoir indique un problème de conception sérieux .
la source
Ils sont exécutés dans l'ordre dans lequel ils sont enregistrés.
RetrieveDataCompleted
est un Délégué Multicast . Je regarde à travers le réflecteur pour essayer de vérifier, et il semble qu'un tableau soit utilisé dans les coulisses pour garder une trace de tout.la source
Si quelqu'un a besoin de le faire dans le contexte d'un System.Windows.Forms.Form, voici un exemple d'inversion de l'ordre de l'événement Shown.
la source
Un MulticastDelegate a une liste chaînée de délégués, appelée liste d'appel, constituée d'un ou plusieurs éléments. Lorsqu'un délégué de multidiffusion est appelé, les délégués de la liste d'appel sont appelés de manière synchrone dans l'ordre dans lequel ils apparaissent. Si une erreur se produit pendant l'exécution de la liste, une exception est levée.
la source
Mais personne ne dit que la liste d'appels maintient les délégués dans le même ordre qu'ils sont ajoutés. Ainsi l'ordre d'appel n'est pas garanti.
la source
Il s'agit d'une fonction qui placera la nouvelle fonction de gestionnaire d'événements où vous le souhaitez dans la liste d'appels multidélégués.
Ensuite, vous pouvez toujours supprimer la fonction avec un '- =' n'importe où dans votre code.
PS - Je ne fais aucune gestion d'erreur pour le paramètre «position».
la source
J'avais un problème similaire. Dans mon cas, il a été réglé très facilement. Je n'avais jamais vu un délégué qui n'utilisait pas l'opérateur + =. Mon problème a été résolu en ayant un délégué toujours ajouté à la fin, tous les autres sont toujours ajoutés au début. L'exemple de l'OP serait quelque chose comme:
Dans le premier cas, ProcessData1 sera appelé en dernier. Dans le 2ème cas, ProcessData2 sera appelé en premier.
la source