W WinForms zdarzenia są realizowane za pomocą delegatów (Event) oraz specjalnych konstrukcji składniowych Visual Basic — AddHandler i RemoveHandler.
AddHandler.RemoveHandler, ważne jest, aby zawsze dokładnie pasować do adresowanego obsługującego.Przykład:
AddHandler Button1.Click, AddressOf Button1_Click Sub Button1_Click(sender As Object, e As EventArgs) MessageBox.Show("Przycisk został naciśnięty!") End Sub ' Aby się wypisać: RemoveHandler Button1.Click, AddressOf Button1_Click
Przy zamykaniu okien lub niszczeniu obiektów należy zawsze wypisywać się z wydarzeń, aby zapobiec wyciekom pamięci — GC nie usuwa obiektów, dopóki istnieją odniesienia do delegatów.
P: Co się stanie, jeśli zapomnisz wywołać RemoveHandler podczas niszczenia obiektu subskrybenta na wydarzenie?
O: Jeśli obiekt jest subskrybowany na zdarzenie innego obiektu i nie został wypisany (RemoveHandler), to garbage collector nie będzie mógł zwolnić pamięci dla subskrybenta, ponieważ będzie istniała twarda referencja przez delegata zdarzenia. Spowoduje to wyciek pamięci.
Historia
1. W oprogramowaniu do zarządzania zgłoszeniami obiekt dziennika subskrybował się do zdarzeń wszystkich dynamicznie tworzonych formularzy. Po zamknięciu formularzy nie wywołano RemoveHandler, co w efekcie powodowało z czasem wzrost zużycia pamięci — obiekty pozostawały w pamięci aż do zamknięcia całego programu.
Historia
2. W projekcie edukacyjnym zapomniano wypisać obsługującego zdarzenie przy ponownym otwieraniu formularza podrzędnego. W wyniku tego przy każdym otwarciu zdarzenie uruchamiało się kilka razy (za każdym razem dodawany był nowy subskrybent), co powodowało lawinę dublowanych działań oraz zamieszanie w logice interfejsu.
Historia
3. Na przemysłowych panelach operatora inspektor uruchomił automatyczne testowanie, które subskrybuje obsługującego na zdarzenie timera. Po każdym teście obiekt był tworzony na nowo, ale subskrypcja nie była znoszona, co prowadziło do stopniowego spowolnienia, udowadniając krytyczne znaczenie RemoveHandler przy korzystaniu ze zdarzeń.