Wann und wo rufen die RemoveHandler in VB.NET?
Arbeite ich an einer VB.NET windows forms-Projekt in .NET 1.1. Und ich habe diese Art von Architektur, sehr vereinfacht.
Public MustInherit Class BaseTestLogic
Private _TimerPoll As Timer
Public Sub New(ByVal sym As SymbolFileMng, ByVal cfg As LampTestConfig, ByVal daas As DaasManager, ByVal mcf As Elux.Wg.Lpd.MCFs.VMCF)
AddHandler _TimerPoll.Tick, AddressOf TimerPoll_Tick
End Sub
End Class
Public Class SpecificTestLogic
Inherits BaseTestLogic
End Class
Je nachdem, welche Art von test ich mache, ich erstellen Sie eine Instanz eines spezifischen test abgeleitet von BaseTestLogic. Aber ich fand, dass nach Hunderten von Objekt-Kreationen, die ich haben kann StackOverflow Ausnahme.
Ich habe meine code und sah, dass ich vergaß zu entfernen der hf in den Timer-Tick. Die Frage ist, wo und Wann ist es richtig zu entfernen hadler?
Brauche ich zur Umsetzung der IDisposable Schnittstelle in der Basisklasse und RemoveHandler in Entsorgen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie gehen zusammen mit dem entfernen der handler auf, wenn die Dispose aufgerufen wird, aber ein purist würde sagen, dass "Sie sollten nicht zu missbrauchen IDisposable für andere Zwecke als die Entsorgung nicht verwalteten Ressourcen".
Andere option ist, um die hf auf der Abschließen Methode.
Können Sie fühlen sich auch zum entfernen der hf an verschiedenen Orten, wenn das macht keinen Sinn in Ihrem design. Das entfernen eines bereits entfernt-handler wird nicht zu einem Problem - es sei denn, die Veranstaltung ist ein Benutzerdefiniertes Ereignis und seine AddHandler/RemoveHandler-Implementierungen nicht mit dem Verhalten von nicht-custom-events (die ist einfach zu verwenden [Delegate].CombineDelegate/[Delegate].Entfernen). Nur nicht sagen, deine puristischen Freunden darüber, die Sie nicht erfüllen.
Wenn Sie fügen Sie Sie in den Konstruktor es fühlt sich richtig um Sie zu entfernen, in die Entsorgen, aber es hängt natürlich von Ihrem design.
Hier ist eine Frage, mit Informationen darüber, Wann Sie sich sorgen machen müssen, Sie zu entfernen
AddHandler/RemoveHandler Nicht Richtig Entsorgen
Dies ist eine alte Frage, aber ich kam, um es per web-Suche, so ist es immer noch eine nützliche Frage zu Timern. Keine richtige Antwort gegeben wurde, um die ZUGRUNDE liegende problem. Antworten wurden angeboten, um Ihre Frage, aber die Frage war falsch. Ihre Frage sollte sein: Wie kann ich deaktivieren Sie einen timer, damit der event nicht mehr feuert?
Dim WithEvents timer1 als new Timer()
(fügen Sie timer1_Elapsed-code)
Dies löst das problem, sich Gedanken über die IDisposable-oder Finalisieren, weil die Timer-event-handler ist für Sie verwaltet. Wenn Sie nicht mehr benötigen, die timer-set Enabled = False oder Aufruf der Stop () - Methode, um es zu halten tickt.
timer1
zuNothing
(die trennen die Ereignis-Handler), als hoffe, Sie getrennt zu erhalten.Mein Erster Gedanke ist, dass Ihre tatsächlichen problem hat wenig, wenn überhaupt etwas, zu tun mit dem hinzufügen und entfernen von Ereignis-Handlern. Eine StackOverflowException heißt, Sie haben eine Reihe von Funktionen an, die Schaffung einer unendlichen Schleife der rekursiven Aufrufe. Der code, den Sie geschrieben zeigt nicht überall passieren könnte, aber die stack-trace der exception sollte dich der Punkt mit dem fehlerhaften code.
Basierend auf Ihren Kommentar über die Schaffung eines test von einem abgeleiteten Typ, ich Frage mich, ob Sie konnte nach mehr code aus dem Konstruktor in der Basisklasse.
Oder GC.SupressFinalize() aufgerufen wurde, irgendwo in deinem code?