我有一个。NET核心后端,带有接受客户端连接的SignalR。在每个连接上,都会创建一个所谓的"调度器",并将其存储在字典中。连接关闭后,此计划程序对象将从列表中删除。
现在,对于这些调度程序对象,我为对象属性设置了一些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中删除调度程序(我使用Dictionary.Remove(key)
执行此操作(,事件侦听器是否也被删除?我会这么认为,因为属性(等级、Raws、Heats…(也会被删除,对吧?
如果处理程序没有自动删除,我将如何"注销"它们?
如果我需要提供更多代码,请告诉我。
如果以前有人问我这样的问题,我很抱歉,我就是找不到答案。
你说得对,在您从Grades、Raws和Heats中删除条目后,GC将很好地清理内存。
问题是,在删除它们之前,this
实例无法清理。
你可以在这里找到更多关于如何避免内存泄漏的信息。