我闖民宅弱事件MSDN教程。我瞭解基礎知識。我正在研究一個非WPF項目,而我的課程正在公開某些事件。我的問題是不弱的事件 完全取代舊的事件模式?使用它暴露事件的每個類是否好?寬泛地使用弱事件的副作用是什麼?何時使用弱事件?
何時使用弱事件?
回答
基於我所做的閱讀,也不會出現任何特定的底片使用WeakEvents,除了事實,這是更詳細的這樣做。此外,在大多數情況下,您應該能夠在不再需要時從事件中手動取消註冊。在某些情況下,這是不可能的。例如,您引用的MSDN頁提到什麼時候應該使用WeakEvents:
http://msdn.microsoft.com/en-us/library/aa970850.aspx
某些情況下固有借給自己弱的事件模式的應用。一種這樣的情況是數據綁定。在數據綁定中,源對象完全獨立於偵聽器對象(通常是綁定的目標)。 WPF數據綁定的許多方面已經應用了事件如何實現的弱事件模式。
誰已提出任何類型的負對他們的唯一的人是這樣的博客:
大約有一般使用弱事件偵聽器的一些缺點:
- 它的符號是醜陋的,「原始」的.NET方法看起來方式更好
- 你要命名的字符串時,吸住(如果你知道一種更好的方式,與我聯繫!)
- 你成爲一個懶惰的開發不關心訂閱
它只能處理事件與事件處理程序的處理程序
本質上講,他們應該用於您的對象將認購其存在的整個長度,並從物品設置時僅斷開事件。對於其他事情,使用傳統事件並手動註冊/註銷事件是首選。
第二個鏈接被破壞.. –
是的,它似乎原來的網站已經kaput。然而,我引用了原始鏈接中最相關的部分。 –
這是新的鏈接https://catelproject.atlassian.net/wiki/display/CTL/Weak+events –
當使用弱事件?
從MSDN
監聽事件可能會導致內存泄漏
所以,你應該使用弱事件以避免這些泄漏
的目的是什麼呢很好用它是每一個暴露事件的類?寬泛地使用弱事件的副作用是什麼?
見Why is the implementation of events in C# not using a weak event pattern by default?。從「強」事件泄漏並不是那麼平常,弱事件帶有性能成本,並且在每種情況下都可能不需要語義差異,濫用弱參考可能導致事件間歇性地不發射(與濫用引起了內存泄漏正常事件)
可能避免
靜態類和談論內存泄漏時單身小人,當他們獲得一些其它對象,它們會阻止參考例內存泄漏物體被垃圾收集,並因此在應用程序的使用壽命期間泄漏物體,here是一個例子,其中我遇到了需要弱參考以避免記憶Ÿ泄漏
有跡象表明,必須以微弱的事件被認爲是兩個問題:
- 弱事件允許用戶訂閱的事件(消息)甚至不知道類引發事件的身份。在某些情況下甚至可能需要。但是,在某些情況下,可能會導致不必要的複雜性和間接性,導致代碼在運行時難以管理或控制。
- 使用弱事件的主要缺點是可能會鼓勵開發人員忽略他們退訂事件(消息)的部分。在這種情況下,甚至在用戶「超出範圍」之後,事件處理程序也可能被調用。考慮一個沒有明確退訂的訂閱者,並且該訂閱者變得可以收集垃圾但尚未被垃圾收集。弱事件管理器將無法檢測到該狀態,因此它仍然會調用該訂閱者的事件處理程序。這可能會導致各種意想不到的副作用。
在The Weak Event Pattern is Dangerous處查看更多詳細信息。
看到這個source code,說明這個問題使用MvvMCross消息插件作爲弱事件管理器。
- 1. 使用.NetCore中的弱事件
- 2. 弱事件和GC
- 3. 強和弱事件
- 4. 弱事件模式Silverlight 3
- 5. .NET中的弱事件?
- 6. 弱勢事件如何運作?
- 7. C#使用弱引用聆聽第三方長時間生活事件
- 8. 我應該在聽DependencyProperty更改時使用弱事件偵聽器嗎?
- 9. 使用.NET的WeakEventManager實現弱事件的示例
- 10. 弱陣如何使用?
- 11. MonoTouch中的弱事件模式
- 12. WPF中的路由事件較弱
- 13. 帶條件/超時的弱引用
- 14. 短的弱引用何時變爲空?
- 15. 瞭解何時使用事件以及何時使用回調
- 16. 爲什麼AS3默認不使用弱引用? (在事件監聽器中)
- 17. 什麼是WPF應用程序中使用的「弱事件」模式?
- 18. 何時使用dom:loaded/document.ready事件
- 19. 何時使用自定義c#事件
- 20. 何時使用事件總線?
- 21. 何時使用域名事件?
- 22. 如何確定在使用弱事件管理器時目標是否正在偵聽源
- 23. 使用Cocos2d計時事件
- 24. ViewModel中的事件與System.Windows.Interactivity.EventTrigger,它是弱引用?
- 25. 如何使XSS脆弱箱
- 26. 如何使用NSKeyedArchiver存檔弱鏈接?
- 27. 如何在使用弱符號時避免依賴於GLIBC_X.Y
- 28. 何時在Android本地框架(AOSP)中使用弱指針(wp)
- 29. 使用Boost Python與弱點?
- 30. 使用雙向弱指針
沒有任何東西被替換,它只是當事件源對象超過事件訂閱者對象並且訂閱者對象對於取消訂閱事件而言馬虎不清時發生的泄漏。 –
事件*應該*總是弱引用...但不幸的是它們不是默認的。 MS有[a class](http://msdn.microsoft.com/en-us/library/aa970850.aspx),它使用弱引用來處理事件,但不幸的是它的語法非常殘酷。謝天謝地,還有[事件庫](http://www.codeproject.com/Articles/30066/EventBroker-a-notification-component-for-synchrono),它爲弱事件提供了簡單的語法,還有一些對事件的其他改進*(例如,簡單地將多個發佈到相同事件,移除不必要的耦合等)* –