Wie kann ich wissen, ob ein .net-Ereignis bereits behandelt wird?

9

Ich habe Code geschrieben, um ein Ereignis wie folgt zu behandeln:

%Vor%

Es schien, dass zuerst alles funktionierte, aber als ich den Debugger startete, entdeckte ich oft, dass myFunction mehrmals jedes Mal ausgeführt wurde, wenn myObject.myEvent ausgelöst wurde. Ich fand heraus, dass ich dem Code erlaubt hatte, den Event-Handler mehr als einmal hinzuzufügen, was zu diesem Verhalten führte.

Gibt es eine Möglichkeit, so etwas zu tun?

%Vor%     
Daniel Allen Langdon 13.08.2010, 13:36
quelle

8 Antworten

11

Angenommen, Ihr Ereigniscode wird nicht veröffentlicht, können Sie nicht. Die Idee ist, dass die Abonnenten voneinander isoliert sind - Sie können nichts über andere Event-Abonnenten erfahren, die Veranstaltung selbst veranstalten usw..

Wenn das Problem darin besteht, dass Ihren eigenen Handler mehrmals hinzufügt, sollten Sie dies selbst beheben können, indem Sie verfolgen, ob Sie einen Handler hinzugefügt haben . Stevens Idee, den Handler vor dem Hinzufügen zu entfernen, ist eine interessante Problemumgehung: Es ist gültig, zu versuchen, einen Handler zu entfernen, selbst wenn er nicht abonniert ist. Allerdings würde ich dies als einen Workaround für Ihre App betrachten, die nicht wirklich weiß, was sie tun soll. Es ist eine sehr kurzfristige kurzfristige Lösung, aber ich würde mir Sorgen machen, es längerfristig zu lassen.

    
Jon Skeet 13.08.2010, 13:39
quelle
5

Entweder:

  1. Fügen Sie Ihren Handler nicht mehr als hinzu einmal.

  2. Versuch, den Handler nur zu entfernen vor dem Hinzufügen.

Steven Sudit 13.08.2010 13:39
quelle
2

Es gibt keine Möglichkeit zu sagen, dass ein Handler bereits angehängt ist, aber Sie können RemoveHandler sicher für das Ereignis aufrufen, bevor Sie AddHandler aufrufen. Wenn es noch keinen Handler gibt, hat RemoveHandler keine Wirkung.

    
Josh 13.08.2010 13:40
quelle
2

Ich weiß, dass dies ein alter Beitrag ist, wollte aber nur eine Lösung für diejenigen, die in diese Richtung schauen, hinzufügen ...

VB.Net erstellt eine spezielle private Membervariable im Muster von <YourEvent>Event , die Sie dann zum Testen gegen Nothing verwenden können.

%Vor%

Antwort von hier: Ermitteln, ob ein Ereignis wurde noch hinzugefügt

    
hman 06.03.2015 09:49
quelle
0

Speichern Sie Ihre Ereignishandler-Ergebnisse in der Datenbank / Sitzung und lesen Sie sie dann erneut ein, um zu überprüfen, ob das Ereignis bereits behandelt wurde.

    
Kon 13.08.2010 13:40
quelle
0

Ich weiß, dass ich ein paar Jahre zu spät zum Spiel bin, aber Sie könnten immer eine Klassenvariable definieren und dann nach der Tat setzen. Dies ist keine völlig verhärtete Art, Dinge zu tun, aber es ist besser als nur zu hoffen, dass du nichts hast oder es jedes Mal neu hinzufügst. In meinem Fall habe ich dies in einer WinForms-App verwendet, wo ich einen Handler zum Ziehen und Ablegen auf eine Datagridview-Oberfläche hinzufügen wollte. Ich wollte diese Funktionalität stoppen, wenn ein Teil einer anderen Datagridview noch nicht vollständig ausgefüllt war.

Es wäre also so:

Klassenstufe

%Vor%

Konstruktor:

%Vor%

Methode, die das Problem feststellt:

%Vor%     
djangojazz 22.11.2016 23:24
quelle
0

Entfernen Sie den Handler und fügen Sie ihn dann hinzu. Auf diese Weise wird es niemals dupliziert werden. Vorsicht vor dem Null-Referenzfehler, wenn Ihr Objekt nicht existiert. Ich bin auch dabei erwischt worden und kann passieren, wenn Sie den Handler außerhalb des Subs entfernen, in dem der Handler erstellt wurde.

%Vor%     
user1500403 06.09.2015 01:03
quelle
-3

Sie können die Eigenschaft IsHandleCreated verwenden, um zu überprüfen, ob Ihr Ereignis bereits einen Punkt hat oder nicht.

%Vor%     
Muhammad Saqib 08.08.2014 15:43
quelle

Tags und Links