Question

CancelEventArgs fournit une propriété appelée Annuler qui différents gestionnaires d'événements peuvent définir pour indiquer à l'objet qui a appelé l'événement s'il doit continuer son exécution, annuler l'action.

Il semble que, comme les événements sont des délégués de multidiffusion, une simple augmentation de l’événement pourrait invoquer deux délégués. Le premier attribue la valeur true à la propriété Cancel et le second à la propriété false. Les événements 'annulables' de composant / infrastructure prennent-ils en charge ces scénarios et invoquent chaque délégué un par un en vérifiant l'indicateur d'annulation à chaque étape? Quelle est la meilleure pratique pour soulever ce type d’événement? Une seule instance de CancelEventArgs est-elle transmise à chaque délégué? Des instances séparées sont-elles utilisées?

Était-ce utile?

La solution

Un petit test montre rapidement qu'ils utilisent une instance de Cancel (probablement de l'objet EventArgs).

Cela rend le jeu un peu risqué, le résultat dépendant de l'ordre dans lequel les gestionnaires d'événements ont été attachés.

Dans le cas particulier de CancelEventArgs, je pense que le bon modèle serait de définir Cancel sur true ou de le laisser tel quel, afin que l'ordre ne soit pas important.

Autres conseils

Testé:

public static void Main() {
    Event += (sender, e) => e.Cancel = true;
    Event += (sender, e) => e.Cancel = false;
    Event += (sender, e) => e.Cancel = true;

    var args = new CancelEventArgs();
    Event(null, args);

    WL(args.Cancel);
}

static event EventHandler<CancelEventArgs> Event;

L'ordre des gestionnaires d'événements attachés est important.

En règle générale, les événements avec des arguments d'événement non immuables et des délégués de multidiffusion ne doivent pas être utilisés ensemble, mais le framework .NET les utilise très souvent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top