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