一尘不染

为什么以及如何避免事件处理程序内存泄漏?

c#

通过阅读关于StackOverflow的一些问题和答案,我才意识到,+=在C#中使用事件处理程序(或者,我想是其他.net语言)会导致常见的内存泄漏…

过去,我多次使用过这样的事件处理程序,但从未意识到它们会导致或导致应用程序中的内存泄漏。

这是如何工作的(意味着,为什么这实际上会导致内存泄漏)?
我该如何解决这个问题?使用-=同一事件处理程序是否足够?
是否存在处理此类情况的通用设计模式或最佳实践?
示例:我应该如何处理具有许多不同线程的应用程序,并使用许多不同的事件处理程序在UI上引发多个事件?

在已经构建的大型应用程序中,是否有任何简便的方法可以有效地对此进行监视?


阅读 272

收藏
2020-05-19

共1个答案

一尘不染

原因很容易解释:在订阅事件处理程序时,事件的 发布 通过事件处理程序委托(假定委托是一个实例方法)持有对 订阅者 的引用。

如果发布者的寿命比订阅者的寿命长,那么即使没有其他对订阅者的引用,发布者的生命也将保持。

如果您使用相等的处理程序退订该事件,则可以,这将删除该处理程序和可能的泄漏。但是,以我的经验,这实际上很少是一个问题-
因为通常我发现发布者和订阅者的生存期大致相同。

一个可能的原因…但是根据我的经验,它被大肆宣传。当然,您的里程可能会有所不同…您只需要小心。

2020-05-19