我有一个缓存多个codefluent对象的应用程序。当我将几个缓存对象放在临时集合中时,该集合永远不会从内存中释放出来。通过使用ANTS对应用程序进行概要分析,我找到了一个别墅:当对象插入“BaseAdd”中的集合时附加的事件处理程序。集合的功能。
cwProperty.KeyChanged += new System.EventHandler<CodeFluent.Runtime.Utilities.KeyChangedEventArgs<System.Guid>>(this.OnItemKeyChanged);
如何防止附加此事件处理程序或如何清除它?
答案 0 :(得分:1)
实体的默认集合类型为ListCollection
。因此,生成的集合将数据存储在list
和dictionary
中。这允许通过索引或其键访问项目。在此集合中添加项目时,集合需要注册KeyChanged
事件,以便在需要时更新字典。从集合中删除元素时,事件将被分离。
如果您从未使用其密钥访问项目,则可以将集合类型更改为List
。因此,没有字典,因此无需注册KeyChanged
事件。
<cf:entity name="Customer" setType="List">
<cf:property name="Id" />
<cf:property name="FullName" />
</cf:entity>
答案 1 :(得分:0)
我通过删除eventhandler订阅解决了这个问题,因为我知道集合永远不会更新。 OnItemKeyChanged是私有的,因此我创建了一个可以调用的公共函数。
public void RemoveOnItemKeyChangedHandlers()
{
foreach (var cwEntity in this)
{
cwEntity.KeyChanged -= new System.EventHandler<CodeFluent.Runtime.Utilities.KeyChangedEventArgs<System.Guid>>(this.OnItemKeyChanged);
}
}
虽然上面的解决方案有效,但我最终将所有缓存的项目更改为Lists而不是ListCollections。有人忘记这个问题并造成另一次内存泄漏的可能性很大。