.net - .NET 中的事件和内存泄漏

标签 .net events memory-leaks

我正在使用 C# .NET 3.5 ...并且我一直致力于通过将数据库相关事件移动到单独的工作对象中来解耦 BLL 对象。工作对象将实体添加到数据库并将成功或失败消息事件返回到 BLL 对象。

当我在 BLL 中实例化 worker 对象时,我连接了 worker 的事件并使用 event += delegate(eventhandler) 语法设置了 BLL 的事件处理程序。

我听说如果我在处理工作人员时没有使用 -= 语法明确取消监听器的连接,则可能会出现内存泄漏。

所有这些处理都发生在从队列中获取消息并调用适当的 BLL 对象的 Windows 服务中......我担心我可能会在这个过程中引入内存泄漏。

最佳答案

订阅事件会添加从订阅者到提供者的引用。

x.Event += y.handler 表示 x 现在持有对 y 的引用

如果 x 的生命周期比 y 长,那么在对 x 的所有引用都消失之前,y 不能被垃圾回收。

在您的情况下,您正在收听 BLL 中工作人员的事件(如果我理解正确的话),那么除非您明确取消订阅,否则您可以引用 BLL 中剩余的工作人员。

但是,如果您在 BLL 的同时完成工作人员的工作,那么实际上并不重要。

关于.net - .NET 中的事件和内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1843270/

相关文章:

c# - 在 C# 中,是否有任何我不应该使用的内置异常?

c# - TryParse 来自单个时间元素的日期时间

jquery - 如何使用Jquery选择具有事件属性的元素?

c# - 如果我处置我的 Webclient,我是否需要取消订阅 WebClient 的事件

java - 用于打开PlayerInventory的Minecraft Bukkit API事件

c# - .NET 应用程序突然出现非托管内存的极端增长

Python 2.7 内存泄漏与 scipy.minimize

c# - VSTO 开发 - VS2010/.NET 4.0 中的主要改进?

c# - lambda 事件处理程序会导致什么样的内存泄漏?

.net - 如何解决远程数据库上的 Firebird "unavailable database"错误?