由于 OnItemKeyChanged 事件导致代码流内存泄漏

Codefluent Memory leak because of OnItemKeyChanged event

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

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

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

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

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

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

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

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

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