C# 确实从 List 清除事件处理程序中删除对象
C# does removing an object from a List clear event handlers
我有一个带有接受客户端连接的 SignalR 的 .NET Core 后端。
在每个连接上,都会创建一个所谓的 "scheduler" 并将其存储在字典中。连接关闭后,此调度程序对象将从列表中删除。
现在,对于这些调度程序对象,我为对象属性设置了一些 CollectionChanged 处理程序,如下所示:
...
scheduler.Grades.CollectionChanged += (s, e) => this.GradesListener(s, e, connectionId);
scheduler.Raws.CollectionChanged += (s, e) => this.MaterialsListener(s, e, connectionId);
scheduler.Heats.CollectionChanged += (s, e) => this.HeatsListener(s, e, connectionId);
...
因为应用程序中存在内存泄漏,我的问题是:如果我从字典中删除调度程序(我使用 Dictionary.Remove(key)
执行此操作),事件侦听器是否也被删除?我会这么认为,因为属性(Grades、Raws、Heats...)也会被删除,对吗?
如果处理程序没有自动删除,我将如何 "unregister" 它们?
如果我需要提供更多代码,请告诉我。
很抱歉,如果以前有人问过这样的问题,我找不到答案。
你说得对,
从 Grades、Raws 和 Heats 中删除条目后,
GC 会很好地清理内存。
问题是在您删除它们之前 this
无法清理实例。
您可以找到有关如何避免内存泄漏的更多信息here。
我有一个带有接受客户端连接的 SignalR 的 .NET Core 后端。 在每个连接上,都会创建一个所谓的 "scheduler" 并将其存储在字典中。连接关闭后,此调度程序对象将从列表中删除。
现在,对于这些调度程序对象,我为对象属性设置了一些 CollectionChanged 处理程序,如下所示:
...
scheduler.Grades.CollectionChanged += (s, e) => this.GradesListener(s, e, connectionId);
scheduler.Raws.CollectionChanged += (s, e) => this.MaterialsListener(s, e, connectionId);
scheduler.Heats.CollectionChanged += (s, e) => this.HeatsListener(s, e, connectionId);
...
因为应用程序中存在内存泄漏,我的问题是:如果我从字典中删除调度程序(我使用 Dictionary.Remove(key)
执行此操作),事件侦听器是否也被删除?我会这么认为,因为属性(Grades、Raws、Heats...)也会被删除,对吗?
如果处理程序没有自动删除,我将如何 "unregister" 它们?
如果我需要提供更多代码,请告诉我。
很抱歉,如果以前有人问过这样的问题,我找不到答案。
你说得对, 从 Grades、Raws 和 Heats 中删除条目后, GC 会很好地清理内存。
问题是在您删除它们之前 this
无法清理实例。
您可以找到有关如何避免内存泄漏的更多信息here。