【问题标题】:is it necessary to unsubscribe from events?是否有必要取消订阅事件?
【发布时间】:2010-06-03 07:27:38
【问题描述】:

不取消订阅 C# 中的事件可能有多严重? 这是强制性的还是可取的行动?

【问题讨论】:

    标签: c# events memory


    【解决方案1】:

    这是MSDN documentation 中您应该考虑的重要部分

    为了防止您的事件处理程序 事件发生时被调用 提出,只需退订 事件。为了防止资源 泄漏,退订很重要 从你处置之前的事件 订阅者对象。直到你 取消订阅事件, 多播委托,它是底层的 发布对象中的事件有一个 参考代表 封装订阅者的事件 处理程序。 只要出版 对象持有那个引用,你的 订阅者对象不会是垃圾 收集。

    【讨论】:

      【解决方案2】:

      这取决于订阅者和发布者的生存时间。这是一篇关于该问题的深入文章以及有关如何解决该问题的几种方法:Solving the Problem with Events: Weak Event Handlers

      【讨论】:

        【解决方案3】:

        取消订阅事件很重要。如果你不这样做,那么订阅者就不能被垃圾收集,从而导致 - 从本质上讲 - 内存泄漏。这是一个很好的例子,说明如果您不取消订阅可能会遇到的问题:

        http://developers.slashdot.org/article.pl?sid=07/11/17/0552247

        此外,它可能会导致性能问题,因为事件处理程序将继续被调用,即使它不再为您做任何有用的事情。

        另一方面,如果您只是结束程序的执行,则没有理由取消订阅事件。这当然不是强制性的,我认为没有任何理由推荐它。

        【讨论】:

          猜你喜欢
          • 2019-01-31
          • 1970-01-01
          • 1970-01-01
          • 2019-09-07
          • 2019-08-15
          • 2014-10-29
          • 1970-01-01
          • 1970-01-01
          • 2017-05-12
          相关资源
          最近更新 更多