2011-09-15 8 views
6

Jeśli zawsze potrzebuję wywoływać RemoveHandler po użyciu AddHandler, gdzie jest najlepsze miejsce do tego?W vb.net, jeśli używam AddHandler, czy muszę używać RemoveHandler?

Przeszukałem kilka podobnych pytań w następujący sposób, ale nie do końca rozumiem.

When and where to call the RemoveHandler in VB.NET?

AddHandler/RemoveHandler Not Disposing Correctly

Myślałem, zbieranie śmieci w C# lub VB.NET zajmie niewykorzystanych obiektów. Ponadto, w projektancie vb.net, automatycznie generuje Dispose Sub. Nie zwracałem uwagi na programowe udostępnianie zasobów. Czy wystąpią jakiekolwiek problemy z wyciekiem pamięci? Uprzejmie proszę podać mi linki/dokumenty, aby rozpocząć naukę.

Protected Overrides Sub Dispose(ByVal disposing As Boolean) 
    Try 
     If disposing AndAlso components IsNot Nothing Then 
      components.Dispose() 
     End If 
    Finally 
     MyBase.Dispose(disposing) 
    End Try 
End Sub 

Wielkie dzięki!

+0

Będziesz musiał opublikować kontekst, w którym używasz AddHandler. – CommonSense

Odpowiedz

10

Gdybym zawsze trzeba zadzwonić RemoveHandler po użyciu AddHandler, gdzie jest najlepsze miejsce, aby zrobić tak

Nie koniecznie musi to zrobić.

Zwykle musisz się martwić o wywołanie metody RemoveHandler, jeśli obiekt źródłowy (ten ze zdarzeniem) przeżyje subskrybenta. Jeśli pracujesz w formularzu, to pozbycie się formularza uniemożliwi źródłowi podniesienie tego wydarzenia, a oba obiekty będą poza zakresem i (w końcu) zostaną zebrane, więc nie będziesz miał problemu.

Ten problem pojawia się częściej, jeśli subskrybujesz wydarzenie o długim obiekcie z innego obiektu, który "zniknie" przed długo żyjącym obiektem. Może to spowodować wyciek pamięci, nawet przy użyciu garbage collectora. W takim przypadku należy wywołać funkcję RemoveHandler po zakończeniu odsłuchiwania zdarzenia. Nie ma żadnych wskazówek, kiedy to się stanie, ponieważ zależy to od danego zdarzenia i logiki aplikacji.

Powiązane problemy