2010-09-24 8 views
1

Comment gérer correctement les événements d'objets dans une collection? Exemple: J'ai un List<Ping> qui pings de manière asynchrone un certain nombre de serveurs. Comment puis-je savoir si l'un des éléments de la liste a appelé l'événement PingCompleted? Que faire si j'ajoute/supprime des objets Ping?Gestion des événements d'objets dans les collections

Répondre

1

Collection est plutôt meilleure que la liste de l'héritage:

class PingCollection : Collection<Ping> 
{ 
    protected override void InsertItem(int index, Ping item) 
    { 
     ping.PingCompleted += PingCompleted 

     base.InsertItem(index, item); 
    } 

    private void PingCompleted(object sender, EventArgs e) 
    { 
     // do stuff 
    } 
} 

Et ne pas oublier de résilier votre abonnement à supprimer.

(Sous la direction de diriger la suggestion de Dan)

+0

'Liste .Add' n'est pas virtuelle, de sorte que vous devriez écrire' new' au lieu de 'override'. Probablement mieux de maintenir un 'List ' en interne plutôt que d'en hériter, non? –

+1

'Liste ' les méthodes ne sont pas virtuelles. 'Collection ' est probablement ce que vous cherchez. – Ani

+0

@Dan, @Ani: Merci pour la correction. Mais malheureusement, 'Collection .Add()' n'est pas non plus virtuel mais devrait certainement l'être. Pendant ce temps, toutes les autres méthodes - sont. – abatishchev

1

Vous devez définir le gestionnaire d'événements sur chaque instance Ping. Dans le gestionnaire d'événements, vous pouvez inspecter le paramètre source pour identifier l'objet Ping qui a déclenché l'événement. N'oubliez pas de supprimer la référence du gestionnaire une fois que vous avez terminé d'utiliser l'objet pour aider le récupérateur de place à faire son travail.