2012-12-09 55 views
11

我闖民宅弱事件MSDN教程。我瞭解基礎知識。我正在研究一個非WPF項目,而我的課程正在公開某些事件。我的問題是不弱的事件 完全取代舊的事件模式?使用它暴露事件的每個類是否好?寬泛地使用弱事件的副作用是什麼?何時使用弱事件?

+1

沒有任何東西被替換,它只是當事件源對象超過事件訂閱者對象並且訂閱者對象對於取消訂閱事件而言馬虎不清時發生的泄漏。 –

+1

事件*應該*總是弱引用...但不幸的是它們不是默認的。 MS有[a class](http://msdn.microsoft.com/en-us/library/aa970850.aspx),它使用弱引用來處理事件,但不幸的是它的語法非常殘酷。謝天謝地,還有[事件庫](http://www.codeproject.com/Articles/30066/EventBroker-a-notification-component-for-synchrono),它爲弱事件提供了簡單的語法,還有一些對事件的其他改進*(例如,簡單地將多個發佈到相同事件,移除不必要的耦合等)* –

回答

10

基於我所做的閱讀,也不會出現任何特定的底片使用WeakEvents,除了事實,這是更詳細的這樣做。此外,在大多數情況下,您應該能夠在不再需要時從事件中手動取消註冊。在某些情況下,這是不可能的。例如,您引用的MSDN頁提到什麼時候應該使用WeakEvents:

http://msdn.microsoft.com/en-us/library/aa970850.aspx

某些情況下固有借給自己弱的事件模式的應用。一種這樣的情況是數據綁定。在數據綁定中,源對象完全獨立於偵聽器對象(通常是綁定的目標)。 WPF數據綁定的許多方面已經應用了事件如何實現的弱事件模式。

誰已提出任何類型的負對他們的唯一的人是這樣的博客:

http://blog.catenalogic.com/post/2011/11/23/A-weak-event-listener-for-WPF-Silverlight-and-Windows-Phone-7.aspx

大約有一般使用弱事件偵聽器的一些缺點:

  • 它的符號是醜陋的,「原始」的.NET方法看起來方式更好
  • 你要命名的字符串時,吸住(如果你知道一種更好的方式,與我聯繫!)
  • 你成爲一個懶惰的開發不關心訂閱
  • 它只能處理事件與事件處理程序的處理程序

本質上講,他們應該用於您的對象將認購其存在的整個長度,並從物品設置時僅斷開事件。對於其他事情,使用傳統事件並手動註冊/註銷事件是首選。

+0

第二個鏈接被破壞.. –

+0

是的,它似乎原來的網站已經kaput。然而,我引用了原始鏈接中最相關的部分。 –

+0

這是新的鏈接https://catelproject.atlassian.net/wiki/display/CTL/Weak+events –

0

當使用弱事件?

MSDN

監聽事件可能會導致內存泄漏

所以,你應該使用弱事件以避免這些泄漏

的目的是什麼呢很好用它是每一個暴露事件的類?寬泛地使用弱事件的副作用是什麼?

Why is the implementation of events in C# not using a weak event pattern by default?。從「強」事件泄漏並不是那麼平常,弱事件帶有性能成本,並且在每種情況下都可能不需要語義差異,濫用弱參考可能導致事件間歇性地不發射(與濫用引起了內存泄漏正常事件)

可能避免

靜態類和談論內存泄漏時單身小人,當他們獲得一些其它對象,它們會阻止參考例內存泄漏物體被垃圾收集,並因此在應用程序的使用壽命期間泄漏物體,here是一個例子,其中我遇到了需要弱參考以避免記憶Ÿ泄漏

3

有跡象表明,必須以微弱的事件被認爲是兩個問題:

  1. 弱事件允許用戶訂閱的事件(消息)甚至不知道類引發事件的身份。在某些情況下甚至可能需要。但是,在某些情況下,可能會導致不必要的複雜性和間接性,導致代碼在運行時難以管理或控制。
  2. 使用弱事件的主要缺點是可能會鼓勵開發人員忽略他們退訂事件(消息)的部分。在這種情況下,甚至在用戶「超出範圍」之後,事件處理程序也可能被調用。考慮一個沒有明確退訂的訂閱者,並且該訂閱者變得可以收集垃圾但尚未被垃圾收集。弱事件管理器將無法檢測到該狀態,因此它仍然會調用該訂閱者的事件處理程序。這可能會導致各種意想不到的副作用。

The Weak Event Pattern is Dangerous處查看更多詳細信息。
看到這個source code,說明這個問題使用MvvMCross消息插件作爲弱事件管理器。