2009-07-01 14 views
5

Ich habe einen Event-Handler in Code, die ich sehe, wird mehrmals aufgerufen, wenn ich erwarte, dass es nur einmal aufgerufen wird..NET Eventhandler Management

In der Vergangenheit war dies, weil ich die Delegierung an der falschen Stelle definiert habe (also mehr, dass ein Delegat zur Ereignisbehandlungsliste hinzugefügt wird), aber nur einmal (im Klassenkonstruktor)).

Anstatt weiter manuell meinen Code nach Fehlern zu durchsuchen, gibt es einen (einfachen) pragmatischen Ansatz, um herauszufinden, wo Ereignishandler zugewiesen werden?

Antwort

18

Sie können den Standard ersetzen:

public event EventHandler MyEvent; 

... mit

private EventHandler _myEvent; 

public event EventHandler MyEvent 
{ 
    add { _myEvent += value; } 
    remove { _myEvent -= value; } 
} 

Dann könnten Sie die Protokollierung von Stützpunkten innerhalb des Add setzen/Funktionen entfernen und den Call-Stack zu sehen.

+0

Netter Vorschlag +1 –

+0

Das ist eine sehr einfache und saubere Lösung - funktioniert wie ein Charme. Vielen Dank. –

1

Wenn Sie vb.net verwenden, dann sind Sie sicher, dass Sie den Handler nicht in einer Methode hinzufügen und auch das handles-Schlüsselwort verwenden?

Dies bewirkt, dass ein Ereignis zweimal behandelt wird.

+0

Gute Idee, aber auch hier geht es um manuelle Suche. Auch ich benutze C#. Danke trotzdem. –

1

Installieren Sie Resharper, klicken Sie dann mit der rechten Maustaste auf Ihre Veranstaltung und wählen Sie "Nutzungen suchen".

+0

Ich würde gerne, aber ich habe keine Lizenz oder Budget dafür :-( –

+0

Ich würde sagen, es zahlt sich in etwa 1 Monat. Ich würde nie akzeptieren, ohne (oder etwas Ähnliches) wieder zu arbeiten. –

1

Ich habe einen Code dafür. Seine zwei Klassen um Hilfe Zugang zu Veranstaltungen

Event Classes

Und in meinem Code einführen dies:

alt text http://img440.imageshack.us/img440/1656/featurer.jpg

Jetzt können Sie Ereignisse in

Eingabe debuggen
CSoft.Core.EventHelper.Raise(); 
+0

Guter Vorschlag, aber Rogers Idee eines maßgeschneiderten Accessors ist wirklich einfach und funktioniert wie ein Zauber. Danke für Ihre Eingabe –

0

Sie können ändern Name (nicht mit Visual Studio Re-Factoring-Tools, einfach Namen im Code ändern) und sehen, wo Compiler bricht .