2

我们有一个模拟事件并提供一些增强功能的库。它主要通过跟踪您注册的代表来做到这一点。像事件一样,它有可能导致内存泄漏。

我正在将管理委托的类更改为使用弱引用,但我遇到了一个问题:如果您注册了一个匿名 lambda 并且GC.Collect委托被收集。我想以编程方式确定正在注册的委托是否是匿名 lambda,并在这种情况下使用强引用。

问:如何确定委托是否是匿名 lambda(或更一般地说,在语义上我们不希望它立即“消失”的东西)。

一种可能有效的方法是检查Delegate.Target属性是否为空,但这通常会捕获静态方法,因此这可能不是我想要的。另一个选项是检查属性是否IsSpecialNameIsStatic设置为 true Delegate.Method。也不确定这是否是正确的做法。

一个问题是,如果我使用注册它的类的成员对 lambdas 进行强引用,我们仍然会遇到相同的内存泄漏场景......或者我们可能会访问已处置的对象。有没有优雅的方法来处理这个?

4

1 回答 1

1

基本上,你不能。在运行时匿名 lambda方法。您可以检查方法名称:

static int Foo() { return 0; }

void Main()
{
    Func<int> foo = Foo;
    Func<int> bar = () => 0;
    Console.WriteLine(foo.Method.Name); // Foo
    Console.WriteLine(bar.Method.Name); // <Main>b__0
}

这是一个非常糟糕的方法,但它可能是唯一的方法foobar否则无法区分。

于 2013-06-21T14:59:27.043 回答