Attendre le gestionnaire d’événement

Alors, voici deleagte and event

public delegate Task SomeEventHandler(SomeEventArgs e); ... public event SomeEventHandler OnSomething; 

Abonnés (multiples)

 some.OnSomething += DoSomething; ... public async Task DoSomething(SomeEventArgs e) { await SomethingElse(); eA = true; } 

Appel d’événement

 if (this.OnSomething != null) await this.OnSomething(args); // Here args.A is false // It should be true 

Le problème est que la dernière partie continue même lorsque DoSomething n’est pas terminé. Quel serait le problème?

Le problème ici est que plusieurs instances de SomeEventHandler sont en cours d’exécution et qu’il existe donc plusieurs valeurs de Task cours de création. L’appel d’ await ne fonctionne que sur l’un d’eux, d’où l’ await de savoir si c’est la méthode DoSomething qui est attendue ou non.

Pour résoudre ce problème, vous devrez await chaque valeur de Task créée.

 if (this.OnSomething != null) { foreach (var d in this.OnSomething.GetInvocationList().Cast()) { await d(args); } ]