Dans System.ComponentModel, une classe appelée CancelEventArgs contient un membre Cancel pouvant être défini dans les écouteurs d'événement. La documentation sur MSDN explique comment l'utiliser pour annuler des événements depuis un écouteur, mais comment l'utiliser pour implémenter mes propres événements annulables? Existe-t-il un moyen de vérifier le membre Annuler après que chaque écouteur se déclenche ou dois-je attendre jusqu'à ce que l'événement ait renvoyé tous ses écouteurs?Comment implémenter un événement annulable?
9
A
Répondre
16
Pour vérifier chaque auditeur à son tour, vous devez obtenir manuellement les gestionnaires via GetInvocationList:
class Foo
{
public event CancelEventHandler Bar;
protected void OnBar()
{
bool cancel = false;
CancelEventHandler handler = Bar;
if (handler != null)
{
CancelEventArgs args = new CancelEventArgs(cancel);
foreach (CancelEventHandler tmp in handler.GetInvocationList())
{
tmp(this, args);
if (args.Cancel)
{
cancel = true;
break;
}
}
}
if(!cancel) { /* ... */ }
}
}
Questions connexes
- 1. Comment créer un événement annulable dans vb.net
- 2. Implémenter un événement pour un changement dans une SortedList
- 3. Asp.net Mvc: Filtres paramètre annulable
- 4. Comment délier un événement
- 5. comment gérer un événement sur un événement Django Calendrier
- 6. Comment implémenter un mécanisme d'action-cible pour un contrôle personnalisé?
- 7. Comment annuler un événement routé?
- 8. Comment simuler un événement tactile?
- 9. Comment implémenter l'opérateur [] pour un tableau dynamique?
- 10. Comment implémenter un comparateur utilisant des génériques?
- 11. Comment implémenter un singleton en C#?
- 12. Bibliothèque d'entreprise Comment implémenter un IExceptionHandler?
- 13. Comment implémenter un pinceau personnalisé dans WPF?
- 14. Comment implémenter un arbre d'espaces d'états?
- 15. Comment implémenter un système d'équipement dans CakePHP
- 16. SQL Server - Comment implémenter un contenu similaire
- 17. Comment implémenter un callback en PHP?
- 18. Comment implémenter Dispose dans un objet COM
- 19. E/S avec chevauchement: comment réveiller un thread sur un événement de port d'achèvement ou un événement normal?
- 20. Comment implémenter efficacement une boucle d'événements?
- 21. Implémenter un RadioButtonPreference dans Android
- 22. Comment implémenter l'authentification Querystring
- 23. Comment hooker un événement de clavier IE?
- 24. Comment appeler un événement par programmation?
- 25. Comment créer un événement temporisé côté serveur?
- 26. Comment testez-vous un événement FileSystemWatcher?
- 27. Comment ajouter un événement à une classe
- 28. Comment légères enregistrer un événement périodique?
- 29. Comment déclencher un événement en utilisant addHandler
- 30. Comment implémenter SOAP?
Alors que ce code fonctionne, est que le fonctionnement normal d'un CancelEventHandler? Ne sont-ils pas habituellement utilisés dans un pattern BeforeX, AfterX, où si quelque chose dans Before définit Canel, alors X ne se produit pas alors AfterX n'est pas appelé. Pourquoi est-il important d'empêcher les autres auditeurs d'avoir l'événement Avant? –
Je voudrais également connaître la réponse au commentaire ci-dessus sur les raisons pour lesquelles il est important d'empêcher les autres auditeurs d'obtenir l'événement Avant. – MPavlak
Imaginez deux abonnés au même événement (dans le même objet). L'un définit 'cancel = true' et l'autre 'cancel = false'. Selon vous, que se passerait-il? La réponse montre comment éviter une telle situation. Si au moins un abonné annule l'événement, il est annulé. Période. – Joel