由于OnItemKeyChanged事件,Codefluent内存泄漏

时间:2016-07-10 19:27:09

标签: c# codefluent

我有一个缓存多个codefluent对象的应用程序。当我将几个缓存对象放在临时集合中时,该集合永远不会从内存中释放出来。通过使用ANTS对应用程序进行概要分析,我找到了一个别墅:当对象插入“BaseAdd”中的集合时附加的事件处理程序。集合的功能。

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

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

2 个答案:

答案 0 :(得分:1)

实体的默认集合类型为ListCollection。因此,生成的集合将数据存储在listdictionary中。这允许通过索引或其键访问项目。在此集合中添加项目时,集合需要注册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。有人忘记这个问题并造成另一次内存泄漏的可能性很大。