Có cách nào đơn giản để lặp lại tất cả các trình xử lý đã đăng ký với một sự kiện cụ thể không? Vấn đề của tôi là khách hàng đăng ký nhưng quên hủy đăng ký để rò rỉ bộ nhớ xảy ra. Tôi cần một cách cho một đối tượng để ngắt kết nối tất cả các trình xử lý các sự kiện của nó trong phương thức Vứt bỏ để rò rỉ sẽ không xảy ra - ít nhất không phải do các sự kiện.C# Làm thế nào để hủy đăng ký tất cả các trình xử lý sự kiện từ một sự kiện cụ thể?
Trả lời
Set null để sự kiện của bạn: MyEvent = null;
Nhưng nó thực sự tốt hơn để làm cho khách hàng hủy đăng ký từ sự kiện của bạn.
Cách tiếp cận khác là sử dụng mẫu "đại biểu yếu". Khi bạn sử dụng kỹ thuật này, sự kiện chỉ tham chiếu đến các máy khách bằng cách sử dụng WeakReference
mà không giữ chúng trong bộ nhớ. Các khách hàng sẽ được thu gom rác khi chúng không còn được tham chiếu từ một phần khác của ứng dụng (và trình xử lý cũng có thể không được đăng ký tự động khi khách hàng được thu thập).
Điều này thường được sử dụng để giải quyết vấn đề với khách hàng "quên" để hủy đăng ký khỏi sự kiện .NET, do đó, có vẻ như điều này có thể rất phù hợp với sự cố của bạn.
- Dusing Campbell có đẹp article about weak delegates.
- Tôi cũng thích điều này overview at CodeProject, thảo luận về hầu hết các tình huống.
- Weak Events cũng được sử dụng trong WPF, nhưng cách tiếp cận này có vẻ hơi phức tạp (đối với tôi).
Rò rỉ bộ nhớ chỉ xảy ra nếu đối tượng khác (người nghe) chết trước đối tượng của bạn (nguồn sự kiện). Trong trường hợp này, nguồn sự kiện vẫn giữ tham chiếu đến người nghe, điều này ngăn cản người nghe được thu thập. Khi nguồn sự kiện mất, người nghe chưa đăng ký cũng có thể được thu thập.
Nếu nguồn sự kiện chết trước người nghe, điều này không ngăn người nghe được thu thập sau này, khi tất cả các tham chiếu khác được đặt thành rỗng.
Điều này có nghĩa là nguồn sự kiện Phương pháp xử lý không đúng để giải quyết vấn đề này. Nó có thể được giải quyết chỉ trong một mã người nghe. Nói một cách đơn giản, bạn không thể làm gì cả, ngoại trừ việc yêu cầu khách hàng viết mã sạch.
Tại thời điểm viết, câu trả lời chính xác nhất là ít phổ biến nhất.
Bạn có thể vô hiệu hóa trình xử lý sự kiện nhưng điều này sẽ được zapped dù sao sau khi chủ sở hữu của nó được zapped - nó không sai để được siêu gọn gàng, nhưng như Alex nói, nó không phải là nơi vấn đề được.
Lớp nguồn của Adi sẽ cho phép thu thập các đối tượng nghe khi bản thân nó được thu thập, không có nghi ngờ gì. Vì vậy, vấn đề là đối tượng nguồn của Adi đang được mở, có thể từ một số chuỗi tham chiếu dài trong mã của khách hàng.
Bài đăng trên blog sau đây cũng xem xét một giải pháp mà Adi đang giải thích và giải thích lý do tại sao nó không cần thiết.
- 1. Tôi có phải hủy đăng ký tất cả các trình xử lý sự kiện không?
- 2. Làm thế nào để đưa trình xử lý sự kiện vào các sự kiện với Unity
- 3. Điều khiển người dùng được nạp động với Trình xử lý sự kiện - Hủy đăng ký
- 4. Xử lý tất cả các sự kiện chuột trong Android
- 5. Có xấu khi không hủy đăng ký trình xử lý sự kiện không?
- 6. Không gán null loại bỏ tất cả các trình xử lý sự kiện từ một đối tượng?
- 7. Làm cách nào để xóa tất cả trình xử lý sự kiện của sự kiện 'Nhấp' của 'Nút'?
- 8. Thừa kế các trình xử lý sự kiện trong C#
- 9. Một trình xử lý sự kiện cho tất cả các điều khiển trên biểu mẫu
- 10. Xóa tất cả đăng ký sự kiện (Clone linked)
- 11. Làm cách nào để xóa tất cả trình xử lý sự kiện Nhấp?
- 12. Sự kiện .NET - chặn người đăng ký đăng ký một sự kiện
- 13. Đăng ký các trình xử lý cho sự kiện .NET COM trong C++
- 14. Làm mới trình xử lý sự kiện Javascript
- 15. Đọc Sự kiện Nhật ký Sự kiện Windows Cụ thể
- 16. jQuery nhiều trình xử lý sự kiện - Cách hủy?
- 17. Làm thế nào để xóa trình xử lý sự kiện lambda
- 18. JavaScript/jQuery: Nghe các trình xử lý sự kiện mới được đăng ký
- 19. Các xử lý sự kiện để chọn
- 20. Làm thế nào để unbind một xử lý sự kiện cụ thể
- 21. C# xóa một trình xử lý sự kiện
- 22. Nơi hủy đăng ký sự kiện trong một UserFind WinForms
- 23. Xóa tất cả trình xử lý sự kiện trong một lần
- 24. Sự kiện C# đăng ký và hủy đăng ký trùng lặp
- 25. C# Đăng ký sự kiện động
- 26. Backbone Sự kiện: đăng nhập tất cả các sự kiện khi chúng được kích hoạt
- 27. Jquery Xóa tất cả các trình xử lý sự kiện bên trong phần tử
- 28. Làm cách nào để hủy đăng ký sự kiện .NET này?
- 29. Tạo trình xử lý sự kiện C# trống
- 30. Trình xử lý sự kiện hoạt động như thế nào?
Không thể đặt sự kiện thành rỗng, bằng C#. –
Thực tế là có thể, nếu bạn ở trong lớp học nơi sự kiện đã được khai báo. –
Bạn chính xác. –