100 votes

Afin de gestionnaire d'événements d'exécution

Si j'ai mis en place plusieurs gestionnaires d'événements, comme suit:

_webservice.RetrieveDataCompleted += ProcessData1;
_webservice.RetrieveDataCompleted += ProcessData2;

ce sont les gestionnaires d'exécuter lorsque l'événement RetrieveDataCompleted est tiré? Sont ils s'exécutent dans le même fil et de manière séquentielle dans l'ordre qui sont-ils enregistrés?

141voto

Reed Copsey Points 315315

Actuellement, elles sont exécutées dans l'ordre où ils sont inscrits. Cependant, c'est un détail d'implémentation, et je ne voudrais pas compter sur ce problème restant le même dans les versions futures, car il n'est pas requis par les spécifications.

56voto

Philip Wallace Points 4550

La liste d'invocation d'un délégué est un ensemble ordonné de délégués dans lequel chaque élément de la liste invoque exactement l'une des méthodes invoquées par le délégué. Une liste d'invocation peut contenir la duplication des méthodes. Au cours d'une invocation, un délégué invoque les méthodes dans l'ordre dans lequel ils apparaissent dans l'invocation de la liste.

À partir d'ici: Délégué De Classe

15voto

Naser Asadi Points 481

Vous pouvez modifier la commande par le détachement de tous les gestionnaires, et puis re-fixer dans l'ordre souhaité.

public event EventHandler event1;

public void ChangeHandlersOrdering()
{
    if (event1 != null)
    {
        List<EventHandler> invocationList = event1.GetInvocationList()
                                                  .OfType<EventHandler>()
                                                  .ToList();

        foreach (var handler in invocationList)
        {
            event1 -= handler;
        }

        //Change ordering now, for example in reverese order as follows
        for (int i = invocationList.Count - 1; i >= 0; i--)
        {
            event1 += invocationList[i];
        }
    }
}

10voto

Rex M Points 80372

L'ordre est arbitraire. Vous ne pouvez pas compter sur les gestionnaires être exécutées dans un ordre particulier d'une invocation à l'autre.

Edit: Et aussi - à moins que ce soit juste par curiosité - le fait que vous devez savoir est le signe d'un grave problème de conception.

8voto

Bob Points 34449

Ils sont exécutés dans l'ordre dans lequel ils sont inscrits. RetrieveDataCompleted est une Multidiffusion des Délégués. Je suis à la recherche par le biais de réflecteur pour essayer et vérifier, et il ressemble à un tableau est utilisé en coulisses pour garder une trace de tout.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X