C # Hinzufügen und Entfernen von Ereignissen aus einem Timer

8

Ich versuche, Ereignisse aus einem Timer hinzuzufügen und zu entfernen, und ich habe den folgenden Code:

%Vor%

Ich weiß es nicht Wenn ich beim Versuch, Delegierte auf diese Weise hinzuzufügen oder zu entfernen, etwas Dummes mache, kann ich Delegaten hinzufügen und sie wie erwartet auslösen lassen. Wenn ich jedoch versuche, die Ereignisse zu entfernen, feuern sie weiterhin auf Timers Tick.

Kann jemand etwas offensichtlich falsch sehen?

    
TK. 16.02.2009, 17:45
quelle

7 Antworten

8

Ich glaube, dass dieser Code:

%Vor%

erstellt ein neues EventHandler-Objekt. Es wird niemals einen vorhandenen EventHandler entfernen. Um die gewünschte Funktionalität zu erhalten, sollten Sie EventHandlers, nicht MyDelegates, den Methoden add und remove übergeben:

%Vor%

Der aufrufende Code muss die hinzugefügten EventHandler verfolgen, so dass er dasselbe EventHandler-Objekt übergeben kann, wenn es Zeit ist, sich abzumelden.

    
atoumey 16.02.2009, 18:00
quelle
3

Der ursprüngliche Code funktioniert einwandfrei, solange MyDelegate ' ev ' in addEvent übergeben wird und removeEvent dieselbe Objektinstanz ist (z. B. wenn ein Feld MyDelegate auf Klassenebene vorhanden ist) die die Instanz enthält oder wenn Sie dem Rat mehrerer anderer hier folgen und die MyDelegate -Objekte in einem Dictionary behalten).

Ich vermute, das Problem besteht darin, dass der Code, der addEvent und removeEvent aufruft, neue MyDelegate -Instanzen weitergibt, die auf eine Handler-Methode verweisen, etwa so:

%Vor%

In diesem Fall erstellen addEvent und removeEvent EventHandler delegates, die auf verschiedene Methodenadressen verweisen, obwohl diese wiederum auf dieselbe Methode verweisen ( this.HandlerMethod ). Dies liegt daran, dass die EventHandler delegiert, dass add und remove den Punkt auf die MyDelegate.Invoke() -Methode für verschiedene MyDelegate -Instanzen und nicht direkt auf die Adresse von this.HandlerMethod legen.

    
Jeff Sternal 16.02.2009 21:55
quelle
2

Ihr Problem kommt von Hilfsmethoden, um dies zu tun. Ohne sie funktioniert es wie erwartet, mit ihnen weiß es nicht, was es lösen soll.

Um dies zu beheben, müssen Sie ein Wörterbuch mit dem Wert, den der EventHandler in der Hooking-Methode erstellt hat, pflegen, damit Sie diesen Wert später entfernen können.

Etwas wie:

%Vor%

Sie sollten die entsprechenden Prüfungen hinzufügen, wenn das Element existiert.

Sie könnten auch Ihren Parametertyp ändern und er wird wie erwartet funktionieren.

%Vor%     
Samuel 16.02.2009 18:00
quelle
1

Sie sollten sich einfach abmelden können, indem Sie wie folgt auf den Namen Ihrer geraden Verarbeitungsmethode verweisen:

%Vor%     
Factor Mystic 16.02.2009 17:51
quelle
0

Beim Hinzufügen und Entfernen von Ereignishandlern erstellen Sie jedes Mal einen neuen Wrapper für Ihren Delegaten. In Ihrer remove-Methode wird also versucht, ein neues EventHandler-Objekt zu entfernen, das dem Ereignis überhaupt nicht als Listener hinzugefügt wurde.

Wenn Sie diese Art von Setup weiterhin verwenden möchten, könnten Sie Ihre EventHandler vielleicht in ein Dictionary stecken. Fügen Sie in der addEvent-Methode den neu erstellten EventHandler in Ihr Wörterbuch ein, und ziehen Sie in der removeEvent-Methode den EventHandler aus dem Wörterbuch, und entfernen Sie ihn, anstatt einen neuen zu erstellen.

    
John Conrad 16.02.2009 17:55
quelle
0

Ich weiß nicht, was Sie falsch machen, aber der übliche Ansatz, den ich für Timer verwenden würde, wäre, das Ereignis Tick zu abonnieren und dann den Timer zu deaktivieren, wenn Sie die Ereignisse nicht erhalten möchten , erneut aktivieren, wenn Sie dies tun.

Kann Ihnen nicht helfen, wenn Sie mehr als einen Event-Handler an das Event angeschlossen haben, aber hoffentlich nützlich sind.

    
Sam Meldrum 16.02.2009 18:01
quelle
0

Das sollte funktionieren:

%Vor%     
B. Clay Shannon 02.03.2016 23:55
quelle

Tags und Links