相关疑难解决方法(0)

使用lambdas作为事件处理程序会导致内存泄漏吗?

假设我们有以下方法:

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();
}
Run Code Online (Sandbox Code Playgroud)

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

在我们完成调用之后有没有办法取消挂起lambda事件处理程序MethodThatFiresAnEvent

lambda memory-leaks event-handling

20
推荐指数
1
解决办法
5978
查看次数

使用匿名委托进行事件处理时的垃圾收集

UPDATE

我将这里的各种答案结合到一个新问题的"确定"答案中.

原始问题

在我的代码中,我有一个事件发布者,它在应用程序的整个生命周期中都存在(这里简化为基本要素):

public class Publisher
{
    //ValueEventArgs<T> inherits from EventArgs
    public event EventHandler<ValueEventArgs<bool>> EnabledChanged; 
}
Run Code Online (Sandbox Code Playgroud)

因为这个发布者可以在所有地方使用,所以我对自己创建这个小帮助类非常满意,以避免在所有订阅者中重写处理代码:

public static class Linker
{
    public static void Link(Publisher publisher, Control subscriber)
    {
         publisher.EnabledChanged += (s, e) => subscriber.Enabled = e.Value;
    }

    //(Non-lambda version, if you're not comfortable with lambdas)
    public static void Link(Publisher publisher, Control subscriber)
    {
         publisher.EnabledChanged +=
             delegate(object sender, ValueEventArgs<bool> e)
             {
                  subscriber.Enabled = e.Value;
             };
    }
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,直到我开始在较小的机器上使用它,当我偶尔开始:

System.ComponentModel.Win32Exception
Not enough storage is available to process …
Run Code Online (Sandbox Code Playgroud)

c# garbage-collection event-handling

13
推荐指数
2
解决办法
1万
查看次数