2011-09-15 30 views
6

Nếu tôi luôn cần gọi RemoveHandler sau khi sử dụng AddHandler, đâu là nơi tốt nhất để làm như vậy?Trong vb.net, nếu tôi sử dụng AddHandler, tôi có phải sử dụng RemoveHandler không?

Tôi đã tìm kiếm một số câu hỏi tương tự như sau, nhưng tôi không hiểu lắm.

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

AddHandler/RemoveHandler Not Disposing Correctly

Tôi nghĩ thu gom rác thải trong C# hay vb.net sẽ chăm sóc các đối tượng sử dụng. Ngoài ra, trong thiết kế vb.net, nó sẽ tự động tạo ra Dispose Sub. Vì vậy, tôi không chú ý đến tài nguyên phát hành chương trình nào cả. Tôi có gặp vấn đề về rò rỉ bộ nhớ nào không? Xin vui lòng cung cấp cho tôi một số liên kết/tài liệu để tôi bắt đầu học.

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 

Cảm ơn rất nhiều!

+0

Bạn sẽ phải đăng ngữ cảnh mà bạn đang sử dụng AddHandler. – CommonSense

Trả lời

10

Nếu tôi luôn cần phải gọi RemoveHandler sau khi sử dụng AddHandler, đâu là nơi tốt nhất để làm như vậy

Bạn không nhất thiết phải làm điều này.

Bạn thường chỉ cần lo lắng về việc gọi RemoveHandler nếu đối tượng nguồn của bạn (đối tượng có sự kiện) sẽ thoát khỏi người đăng ký của bạn. Nếu bạn đang làm việc trong một Biểu mẫu, thì biểu mẫu được xử lý sẽ ngăn nguồn phát sinh sự kiện nữa và cả hai đối tượng sẽ nằm ngoài phạm vi và (cuối cùng) thu gom rác, vì vậy bạn sẽ không gặp vấn đề gì.

Vấn đề này phát sinh nhiều hơn nếu bạn đang đăng ký một sự kiện trên đối tượng sống dài từ một số đối tượng khác sẽ "biến mất" trước đối tượng dài. Điều này có thể gây rò rỉ bộ nhớ, ngay cả với bộ thu gom rác. Trong trường hợp đó, bạn muốn gọi RemoveHandler khi bạn đã nghe xong sự kiện này. Mặc dù vậy, không có hướng dẫn đơn lẻ nào khi điều này xảy ra vì nó phụ thuộc vào sự kiện được đề cập và logic ứng dụng của bạn.

Các vấn đề liên quan