2009-04-19 8 views
1

Similaire aux événements KeyPress, je souhaite que tous ceux qui sont abonnés à l'événement puissent définir e.Handled dans ma classe EventArgs. Si elles reviennent vrai, je ne veux plus continuer à tirer des événements. Des idées comment mettre en œuvre cela? En ce moment, voici ma méthode:Comment puis-je arrêter le traitement d'autres événements?

protected void OnDataReceived(SocketAsyncEventArgs e) 
{ 
    if (DataReceived != null) 
    {     
     DataReceived(this, e); 
    } 
} 

De ma compréhension, tout le monde qui a souscrit à l'événement recevra notification, la mise si e.Handled = true; n'aura aucun effet ici.

+0

Je pense que vous avez été pris au piège par le motif de l'auditeur dans ce cas. Contrôlez-vous tout le code? – ojblass

+0

Maintenant, j'ai le contrôle de tout le code, mais comme je suis en train d'implémenter un modèle de plugin, je ne le ferai peut-être pas dans le futur. Essentiellement, j'ai un événement, et le premier plugin pour gérer cet événement, je ne veux pas d'autres plugins pour effectuer un traitement supplémentaire sur celui-ci. Quelques événements que je fais. – esac

Répondre

4

Exemple de code pour une solution utilisant Delegate.GetInvocationList:

public class MyEventArgs : EventArgs 
{ 
    public bool Handled { get; set; } 
} 

public class SomeClass 
{ 
    public event EventHandler<MyEventArgs> SomeEvent; 

    protected virtual void OnSomeEvent(MyEventArgs e) 
    { 
     var listeners = SomeEvent.GetInvocationList(); 
     foreach (var listener in listeners) 
     { 
      if (e.Handled) break; 
      ((EventHandler<MyEventArgs>)listener).Invoke(this, e); 
     } 
    } 
} 
Questions connexes