可以使用lambda作为事件处理程序导致内存泄漏?

假设我们有以下方法:

private MyObject foo = new MyObject();

// and later in the class

public void PotentialMemoryLeaker(){
  int firedCount = 0;
  foo.AnEvent += (o,e) => { firedCount++;Console.Write(firedCount);};
  foo.MethodThatFiresAnEvent();
}

如果具有此方法的类被实例化并且多次调用PotentialMemoryLeaker方法,那么我们是否会泄漏内存?

有什么办法脱钩是拉姆达事件处理程序,我们就大功告成后调用MethodThatFiresAnEvent


是的,将它保存到一个变量并解开它。

DelegateType evt = (o, e) => { firedCount++; Console.Write(firedCount); };
foo.AnEvent += evt;
foo.MethodThatFiresAnEvent();
foo.AnEvent -= evt;

是的,如果你不这样做,你会泄漏内存,因为你每次都会连接一个新的委托对象。 你也会注意到这一点,因为每次你调用这个方法时,它会向控制台转储越来越多的行(不仅仅是一个越来越多的行数,而是一次调用MethodThatFiresAnEvent它会转储任何数量的项目,一次每个连接匿名方法)。


你不会泄漏内存,你也会多次调用你的lambda。 'PotentialMemoryLeaker'的每次调用都会将lambda的另一个副本添加到事件列表中,并且当'AnEvent'被触发时将调用每个副本。


那么你可以扩展在这里做的事情,使代表更安全地使用(没有内存泄漏)

链接地址: http://www.djcxy.com/p/51467.html

上一篇: Can using lambdas as event handlers cause a memory leak?

下一篇: UnHooking Events with Lambdas in C#