1

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

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

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

4

2 回答 2

1

实体的默认集合类型是ListCollection。因此,生成的集合将数据存储在 alist和 adictionary中。这允许通过它的索引或它的键来访问一个项目。当您在此集合中添加项目时,该集合需要注册KeyChanged事件,以便在需要时更新字典。当您从集合中移除一个元素时,该事件将被分离。

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

<cf:entity name="Customer" setType="List">
  <cf:property name="Id" />
  <cf:property name="FullName" />
</cf:entity>
于 2016-07-11T08:19:19.740 回答
0

我通过删除事件处理程序订阅解决了这个问题,因为我知道集合永远不会更新。OnItemKeyChanged 是私有的,因此我创建了一个可以调用的公共函数。

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

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

于 2016-07-13T08:26:19.467 回答