C# 因OnItemKeyChanged事件导致Codefluent内存泄漏

C# 因OnItemKeyChanged事件导致Codefluent内存泄漏,c#,codefluent,C#,Codefluent,我有一个缓存多个codefluent对象的应用程序。当我将其中几个缓存的对象放入临时集合时,集合永远不会从内存中释放。通过使用ANTS分析应用程序,我找到了villan:一个eventhandler,当对象插入到集合的“BaseAdd”函数中时会附加它 cwProperty.KeyChanged += new System.EventHandler<CodeFluent.Runtime.Utilities.KeyChangedEventArgs<System.

我有一个缓存多个codefluent对象的应用程序。当我将其中几个缓存的对象放入临时集合时,集合永远不会从内存中释放。通过使用ANTS分析应用程序,我找到了villan:一个eventhandler,当对象插入到集合的“BaseAdd”函数中时会附加它

            cwProperty.KeyChanged += new System.EventHandler<CodeFluent.Runtime.Utilities.KeyChangedEventArgs<System.Guid>>(this.OnItemKeyChanged);
cwProperty.KeyChanged+=new System.EventHandler(this.OnItemKeyChanged);

如何防止附加此eventhandler或如何清理此事件处理程序?

实体的默认集合类型为
列表集合
。因此,生成的集合将数据存储在
列表
字典
中。这允许通过索引或键访问项目。在此集合中添加项时,集合需要注册
KeyChanged
事件,以便在需要时更新词典。从集合中移除元素时,将分离事件

如果从不使用项的键访问项,可以将集合类型更改为
List
。因此,没有字典,因此无需注册
KeyChanged
事件

<cf:entity name="Customer" setType="List">
  <cf:property name="Id" />
  <cf:property name="FullName" />
</cf:entity>

我通过删除eventhandler订阅解决了这个问题,因为我知道集合从未更新过。这个函数是私有的,因此我创建了一个可以调用的公共函数

    public void RemoveOnItemKeyChangedHandlers()
    {
        foreach (var cwEntity in this)
        {
            cwEntity.KeyChanged -= new System.EventHandler<CodeFluent.Runtime.Utilities.KeyChangedEventArgs<System.Guid>>(this.OnItemKeyChanged);
        }
    }
public void removeonimkeychangedhandlers()
{
foreach(本文件中的var cwEntity)
{
cwEntity.KeyChanged-=new System.EventHandler(this.OnItemKeyChanged);
}
}

虽然上述解决方案有效,但我最终将缓存的所有项都更改为列表,而不是ListCollections。有人忘记这个问题并造成另一个内存泄漏的可能性很大。

我已经想到了这一点,但问题是在使用codefluent集合的接口中需要集合。我现在通过删除eventhandler上的订阅解决了这个问题。看更新…小心!将集合更改为列表而不是listcollection会降低性能!!!