WinForms'da olaylar, temsilciler (Event) ve Visual Basic'in özel sözdizimsel yapıları - AddHandler ve RemoveHandler aracılığıyla gerçekleştirilir.
AddHandler ifadesi ile yapılır.RemoveHandler ile yapılır, hedeflenen işleyici ile tam olarak eşleşmek önemlidir.Örnek:
AddHandler Button1.Click, AddressOf Button1_Click Sub Button1_Click(sender As Object, e As EventArgs) MessageBox.Show("Butona basıldı!") End Sub ' Aboneliği iptal etmek için: RemoveHandler Button1.Click, AddressOf Button1_Click
Pencereler kapandığında veya nesneler yok edildiğinde olaylardan abonelikten çıkmak gereklidir, aksi takdirde bellek sızıntılarını önlemek için — GC, temsilcilerin referansları olduğu sürece nesneleri silmez.
S: Olayı dinleyen nesnenin yok edilmesi sırasında RemoveHandler çağrısı yapılmazsa ne olur?
C: Eğer bir nesne başka bir nesnenin olayına abone olmuşsa ve abonelik iptal edilmediyse (RemoveHandler), çöp toplayıcı bu abonenin belleğini serbest bırakamaz, çünkü bu durum olay temsilcisi aracılığıyla süren güçlü bir referans olur. Bu, bellek sızıntısına yol açar.
Tarihçe
1. Talepleri takip eden bir yazılımda, günlük nesnesi dinamik olarak oluşturulan tüm formlara olaylara abone oluyordu. Formlar kapatıldığında RemoveHandler çağrılmadığı için, uygulamanın çalışması süresince bellek tüketimi artıyordu — nesneler tüm program kapatılana kadar bellekte kalıyordu.
Tarihçe
2. Eğitim projesinde, alt form tekrar açıldığında olay işleyicisinin aboneliği iptal edilmeyi unutuldu. Sonuç olarak, her açılışta olay birden fazla kez tetiklendi (her seferinde yeni bir abone eklenmiş oldu) ve bu, eylemlerin kopyalanması ve arayüz mantığında karışıklık yarattı.
Tarihçe
3. Endüstriyel panellerdeki operatör müfettişi, olay zamanlayıcısına işleyici atan bir otomatik test başlattı. Her testten sonra nesne yeniden oluşturuluyordu, ama abonelik kaldırılmıyordu, bu da yavaşlamaya yol açtı ve olayların kullanılmasında RemoveHandler'ın kritik önemini kanıtladı.