当前位置:  开发笔记 > 编程语言 > 正文

什么是WPF应用程序中使用的"弱事件"模式?

如何解决《什么是WPF应用程序中使用的"弱事件"模式?》经验,为你挑选了3个好方法。

WindowsBaseDLL定义IWeakEventListener与摘要事件:

为期望通过WeakEvent模式和System.Windows.WeakEventManager接收事件的类提供事件侦听支持.

这个模糊的描述没有描述'WeakEvent模式'实际上是什么.

那么,这个模式是什么,为什么它被使用并且它在WPF应用程序之外是否有用?

编辑已经有一些好的答案,但没有人谈到这种模式在WPF应用程序之外是否有用.在我看来,弱事件模式,如依赖属性,与WPF API和DLL密不可分.是否有适用于非WPF应用程序的等效实现?



1> Jon Skeet..:

重要的一点是在评论中:

遵循WeakEvent模式的主要原因是事件源具有可能独立于事件侦听器的对象生存期.使用WeakEventManager的中央事件调度允许侦听器的处理程序被垃圾收集,即使源对象仍然存在

所以,如果你有publishersubscriber对象,那么通常在subscriber订阅了publisher事件之后,subscriber就不能进行垃圾回收.弱事件模式使两个"弱"之间的链接(如在WeakReference中),因此没有这种依赖.(另一种方法是在subscriber想要获得垃圾收集资格时取消订阅该事件,但这会变得混乱.)


@zvolkov:因为突然订户需要知道*什么时候它想要有资格进行垃圾收集,这通常会导致系统周围传播额外的知识,突然间你失去了*automatic*垃圾的一半好处采集.

2> Gishu..:

WeakEvent模式

订阅事件可能导致订阅者无法收集.您假设该对象将被收集,因为您没有对其进行任何其他引用 - 但事件发布者保留在侦听器对象上并将其保留在内存中(除非它明确取消订阅,在这种情况下您需要确切地知道何时退订).管理泄漏.

作为一个拇指规则,如果事件发布者要比听众停留的时间更长,你可能会遇到这个问题,应该检查一下.

WeakEvents应该帮助你在这里,如果对象的唯一有效引用是'弱',将收集对象.只有在计划开发新控件时才应该关注此模式,这些控件通常会暴露大量事件.

基本思路类似于WeakReference和垃圾收集.



3> Jowen..:

在.NET 4.5中,改进了对建立对事件的弱引用的支持.

代替

source.Event += OnEvent;

您可以使用新的WeakEventManager :

WeakEventManager.AddHandler(source, "Event", OnEvent);

在这里阅读更多.

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有