C# - das hinzufügen und entfernen von Ereignissen aus einem timer
Bin ich versucht, hinzufügen und entfernen von Ereignissen aus einem timer, und ich habe den folgenden code:
Timer myTimer = new Timer(); //Windows.Forms Timer
public void addEvent(MyDelegate ev)
{
myTimer.Tick += new EventHandler(ev);
}
public void removeEvent(MyDelegate ev)
{
myTimer.Tick -= new EventHandler(ev);
}
Ich weiß nicht, Wenn ich irgendetwas dummes versuchen, die add-und remove-Delegierten in dieser Weise, ich bin in der Lage, die Delegierten und Sie zu Feuer, wie erwartet. Jedoch wenn ich versuche zu löschen, die Ereignisse, die Sie weiterhin Feuer auf Timer Tick.
Kann jemand sehen, alles, was offensichtlich falsch ist?
- Könnten Sie zeigen die Definition der MyDelegate und erklären, warum es da ist?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, dass dieser code:
erzeugt eine neue Event-Handler-Objekt. Es wird nie entfernen Sie eine vorhandene Event-Handler. Um die Funktionalität, die Sie möchten, sollten Sie die übergabe in EventHandlers, nicht MyDelegates, um die add-und remove-Methoden:
Den aufrufenden code haben, um zu verfolgen die Event-Handler Hinzugefügt, so dass es passieren kann in der gleichen Event-Handler-Objekt, wenn es Zeit ist, zu kündigen.
Dem ersten code funktioniert gut, solange die
MyDelegate
'ev
' übergebenaddEvent
undremoveEvent
ist die gleiche Objekt-Instanz (Zum Beispiel, wenn es eine Klasse-level -MyDelegate
Feld enthält die Instanz oder, wenn Sie Folgen Sie den Rat von mehreren anderen hier und halten dieMyDelegate
Objekt(E) in einem Wörterbuch).Ich vermute, das problem ist, dass der code ruft
addEvent
undremoveEvent
ist vorbei neueMyDelegate
Instanzen verweisen auf einige handler-Methode, etwa so:In diesem Fall
addEvent
undremoveEvent
erstellenEventHandler
Delegierte, die aus unterschiedlichen Methode-Adressen auch dann, wenn diese Delegierten wiederum verweisen auf die gleiche Methode (this.HandlerMethod
). Dies ist, weil dieEventHandler
Delegierten, dassadd
undremove
erstellen, zeigen Sie auf dieMyDelegate.Invoke()
- Methode auf verschiedenenMyDelegate
Instanzen, anstatt direkt an die Adresse derthis.HandlerMethod
.Dein problem kommt von helper-Methoden, dies zu tun. Ohne Sie, es funktioniert wie erwartet, das Sie es nicht wissen, was zu trennen.
Dieses Problem zu beheben, müssen Sie halten ein dictionary mit dem Wert wird der Event-Handler erstellt, die in die hook-Methode, so dass Sie können entfernen Sie den Wert später.
Etwas wie:
Sollten Sie die entsprechenden prüft, ob das element vorhanden ist.
Könnte man auch ändern Sie Ihre parameter-Typ, und es funktioniert wie erwartet.
Sollten Sie nur in der Lage, sich durch verweisen auf den Namen Ihres noch-handling-Methode etwa so:
Beim hinzufügen und entfernen von Ereignis-Handler erstellen Sie eine neue wrapper für Ihre Delegierten jeder Zeit. Also in deinem remove-Methode, es zu entfernen versuchen eine neue - Event-Handler-Objekt, das wurde nie aufgenommen, wie ein listener für das Ereignis in den ersten Platz.
Wenn Sie möchten, um mit dieser Art von setup, könnte man vielleicht kleben Sie Ihr Event in ein Wörterbuch. In die addEvent-Methode, halten Sie Ihre neu erstellte Event-Handler in Ihrem Wörterbuch, und in der removeEvent Methode, ziehen Sie die Event-Handler aus dem Wörterbuch und zu entfernen, dass anstelle der Instanziierung einer neuen.
Ich weiß nicht, was du falsch machst, aber die übliche Vorgehensweise, die ich benutzen würde für Timer wäre zu abonnieren
Tick
Ereignis, und deaktivieren Sie den Timer, wenn Sie nicht wollen, zu erhalten, die Ereignisse zu re-aktivieren, wenn Sie tun.Kann dir nicht helfen, wenn Sie mehr als ein event-handler Anschluss an die Veranstaltung, aber hoffentlich von einigem nutzen.
Sollte dies funktionieren: