gpt4 book ai didi

c# - 如何创建弱引用事件处理程序?

转载 作者:太空狗 更新时间:2023-10-30 00:31:16 26 4
gpt4 key购买 nike

我正在研究如何正确创建弱引用事件处理程序。由于WPF已经有了避免事件内存泄漏的解决方案,所以我反编译了“WeakEventManager”类并花了一些时间对其进行分析。

我发现,“WeakEventManager”类依赖于创建和存储对目标对象以及事件处理程序委托(delegate)的弱引用。以下是一些代码段:

this._list.Add(new WeakEventManager.Listener(target, handler));


public Listener(object target, Delegate handler)
{
this._target = new WeakReference(target);
this._handler = new WeakReference((object) handler);
}

我在问自己这个简单的解决方案是否已经有效,或者我是否忽略了一个重要方面,因为我在 Internet 上找到的大多数其他解决方案都很复杂且难以理解。到目前为止我能找到的最佳解决方案使用未绑定(bind)的委托(delegate)。这是某种将事件处理程序和事件订阅者实例作为参数的包装委托(delegate)(是的,它需要在委托(delegate)调用期间传入事件订阅者对象)。

你可以在这里找到这篇很棒的文章:

http://diditwith.net/CommentView,guid,aacdb8ae-7baa-4423-a953-c18c1c7940ab.aspx#commentstart

“WeakEventManager”类不依赖于了解订阅者类或任何其他信息。除此之外,它还适用于匿名代表。如果一个解决方案只需要他们存储对委托(delegate)的弱引用,为什么开发人员要花这么多时间编写一个不仅有效而且易于使用的解决方案?有什么收获?

更新:因为有人对这个问题投了反对票(可能有点不明确),我想给出一个更准确的问题:

源代码是创建一个有效的弱事件处理程序所需的全部吗?如果没有,缺少什么?

最佳答案

did I overlook an important aspect

是的,一个重要的。你用一个“泄漏”换了另一个。现在,您不再阻止事件订阅者对象被垃圾收集,而是阻止收集 WeakReference 对象。你没有领先。

需要的是一种机制来清除那些陈旧的 WeakReferences。当它们的 IsAlive 属性返回 false 时,您不再需要它们,然后将其从 _list 中删除。但是你必须单独检查,一些代码需要处理这个问题。一个显而易见的选择是检查事件何时添加或何时触发。但这还不够,因为客户端代码只会在初始化时添加,您无法保证事件始终被触发。

所以以后需要一些方案。一切皆有可能,没有什么是非常理想的,因为工作很忙,而且往往什么都做不成。做出正确的选择很重要。这当然包括根本不这样做,它往往是解决设计问题的创可贴。

关于c# - 如何创建弱引用事件处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28396393/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com