通过阅读关于StackOverflow的一些问题和答案,我才意识到,+=在C#中使用事件处理程序(或者,我想是其他.net语言)会导致常见的内存泄漏…
+=
过去,我多次使用过这样的事件处理程序,但从未意识到它们会导致或导致应用程序中的内存泄漏。
这是如何工作的(意味着,为什么这实际上会导致内存泄漏)? 我该如何解决这个问题?使用-=同一事件处理程序是否足够? 是否存在处理此类情况的通用设计模式或最佳实践? 示例:我应该如何处理具有许多不同线程的应用程序,并使用许多不同的事件处理程序在UI上引发多个事件?
-=
在已经构建的大型应用程序中,是否有任何简便的方法可以有效地对此进行监视?
原因很容易解释:在订阅事件处理程序时,事件的 发布 者 通过事件处理程序委托(假定委托是一个实例方法)持有对 订阅者 的引用。
如果发布者的寿命比订阅者的寿命长,那么即使没有其他对订阅者的引用,发布者的生命也将保持。
如果您使用相等的处理程序退订该事件,则可以,这将删除该处理程序和可能的泄漏。但是,以我的经验,这实际上很少是一个问题- 因为通常我发现发布者和订阅者的生存期大致相同。
这 是 一个可能的原因…但是根据我的经验,它被大肆宣传。当然,您的里程可能会有所不同…您只需要小心。