繁体   English   中英

取消订阅班级活动?

[英]unsubscribing events from class?

对于这种情况,我需要一些最佳实践方面的建议。 我搜索了但没有找到满意的答案。

我们在Winforms项目中使用了第三方(.net)DLL。 它引发了一些事件,我们订阅了。 问题是,我需要在班上明确取消订阅这些事件吗?

顺便说一句,我们俩都使用.net framework4。感谢您的建议。

一些示例代码...

public class MyClientCode: IDisposable
{
   private readonly 3rdParty.TheirClass _theirClass;
   public MyClientCode()
  {
     _theirClass = new _theirClass()
     _theirClass.ReadData += ReadDataEvent;
  }

  public void SomeOtherMethod()
  {
           //some other code
  }

  public void ReadDataEvent()
  {
    //some code
  }

  public void Dispose()
  {
    _theirClass.ReadData -= ReadDataEvent;
  }
}

在按钮单击事件中,我确实...

 MyClientCode code = new MyClientCode();
 code.SomeOtherMethod();

如果您不取消订阅,则不会对该事件进行预订(该对象将保留在内存中)。 这会导致内存泄漏并导致过多的内存使用。

但是 ,如果事件的寿命与包含该事件的类的寿命较短或相同,则在您的情况下,将正确收集内存。 如果您有另一个对象引用非私有事件,那么您将遇到问题。

参见MSDN

取消订阅事件之前,发布对象中作为事件基础的多播委托具有对封装了订户的事件处理程序的委托的引用。 只要发布对象拥有该引用,您的订阅者对象就不会被垃圾回收。

请注意,仅在不应该将其保留在内存中的情况下,才需要退出订阅。 (例如,当您关闭应用程序中的窗口时,应取消订阅任何事件,否则该窗口仍将保留在内存中。)如果包含对象被手动销毁,则事件也将被销毁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM