何时使用弱事件?

时间:2012-12-09 15:26:31

标签: c# .net mef

我在弱事件上引用了MSDN教程。我理解基础知识。我正在开发一个非WPF项目,我的课程正在暴露某些事件。我的问题是弱势事件 完全取代旧的事件模式?每个暴露事件的类都使用它是否好?大量使用弱事件的副作用是什么?

4 个答案:

答案 0 :(得分:11)

根据我所做的阅读,使用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方式看起来更好
  •   
  • 你必须用字符串命名事件,这很糟糕(如果你知道更好的方法,请联系我!)
  •   
  • 它只能处理具有EventHandler处理程序的事件
  •   
  • 你成为一个懒惰的开发者而不关心订阅
  •   

基本上,它们应该用于对象将在其存在的整个长度内订阅的事件,并且仅在对象被处置时断开连接。对于其他所有事情,首选使用传统事件并手动注册/取消注册事件。

答案 1 :(得分:5)

弱事件必须考虑两个问题:

  1. 弱事件允许订阅者订阅事件(消息),即使不知道引发事件的类的身份。在某些情况下甚至可能需要。但是,在某些情况下,可能会引入不必要的复杂性和间接性,从而使代码在运行时难以管理或控制。
  2. 使用弱事件的主要缺点是,它可能会鼓励开发人员忽略他们取消订阅事件(消息)的部分。在这种情况下,即使在订阅者“超出范围”之后也可以调用事件处理程序。考虑一个没有明确取消订阅的订阅者,该订阅者可以收集垃圾,但尚未收集垃圾。弱事件管理器将无法检测到该状态,因此它仍将调用该订户的事件处理程序。这可能会导致各种意想不到的副作用。
  3. The Weak Event Pattern is Dangerous查看更多详情 请参阅此source code,它使用MvvMCross消息传递插件作为弱事件管理器来说明此问题。

答案 2 :(得分:0)

何时使用弱事件?

来自MSDN

  

侦听事件可能导致内存泄漏

所以你应该使用弱事件来避免那些泄漏

在每个暴露事件的类中使用它是否合适?大量使用弱事件的副作用是什么?

Why is the implementation of events in C# not using a weak event pattern by default?。从"强大"泄漏事件不是那么常见,弱事件带有性能成本并且具有在每个上下文中可能都不需要的语义差异,滥用弱引用可能导致事件间歇性地不发射(与滥用正常事件导致相反)内存泄漏)

可以避免的内存泄漏示例

静态类和单身人士在讨论内存泄漏时是坏人,当他们获取对其他对象的引用时,他们将阻止对象被垃圾收集,从而在应用程序的生命周期内泄漏对象,{{3}我是一个例子,我需要一个弱引用来避免内存泄漏

答案 3 :(得分:0)

首先,弱事件并非总是必要的,就像其他事件仅在源对象的寿命超过订阅者时那样。如果是这样,那么是的,您应该使用它,这就是人们所说的The Weak Event Pattern

副作用仅是您将不得不编写更多代码。 Microsoft提供了WeakEventManager类,并且在WPF中存在一些特定的实现,但是您可以从基础WeakEventManager创建自己的继承。

它的工作方式是在源对象和侦听器之间使用weak references,因此这种关系不会阻止GC收集这些对象。对于某些特定的应用程序,这可以解决很多性能问题。