由于 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
。因此,生成的集合将数据存储在 list
和 dictionary
中。这允许通过其索引或键访问项目。当您在此集合中添加一个项目时,该集合需要注册 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。有人忘记这个问题并造成另一个内存泄漏的可能性很大。
我有一个缓存多个 codefluent 的应用程序 objects.When 我将其中几个缓存对象放在一个临时集合中,该集合永远不会从内存中释放。通过使用 ANTS 分析应用程序,我发现了 villan:当对象插入到集合的 'BaseAdd' 函数中时附加的事件处理程序。
cwProperty.KeyChanged += new System.EventHandler<CodeFluent.Runtime.Utilities.KeyChangedEventArgs<System.Guid>>(this.OnItemKeyChanged);
如何防止附加此事件处理程序或如何清理它?
实体的默认集合类型是ListCollection
。因此,生成的集合将数据存储在 list
和 dictionary
中。这允许通过其索引或键访问项目。当您在此集合中添加一个项目时,该集合需要注册 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。有人忘记这个问题并造成另一个内存泄漏的可能性很大。