可以使用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?