我们有一个模拟事件并提供一些增强功能的库。它主要通过跟踪您注册的代表来做到这一点。像事件一样,它有可能导致内存泄漏。
我正在将管理委托的类更改为使用弱引用,但我遇到了一个问题:如果您注册了一个匿名 lambda 并且GC.Collect
委托被收集。我想以编程方式确定正在注册的委托是否是匿名 lambda,并在这种情况下使用强引用。
问:如何确定委托是否是匿名 lambda(或更一般地说,在语义上我们不希望它立即“消失”的东西)。
一种可能有效的方法是检查Delegate.Target
属性是否为空,但这通常会捕获静态方法,因此这可能不是我想要的。另一个选项是检查属性是否IsSpecialName
并IsStatic
设置为 true Delegate.Method
。也不确定这是否是正确的做法。
一个问题是,如果我使用注册它的类的成员对 lambdas 进行强引用,我们仍然会遇到相同的内存泄漏场景......或者我们可能会访问已处置的对象。有没有优雅的方法来处理这个?