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%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.
Entweder:
Fügen Sie Ihren Handler nicht mehr als hinzu einmal.
Versuch, den Handler nur zu entfernen vor dem Hinzufügen.
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.
Antwort von hier: Ermitteln, ob ein Ereignis wurde noch hinzugefügt
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%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% Sie können die Eigenschaft IsHandleCreated
verwenden, um zu überprüfen, ob Ihr Ereignis bereits einen Punkt hat oder nicht.
Tags und Links .net events vb.net event-handling