.NET中的事件和内存泄漏
我正在使用C#.NET 3.5 ...我一直在努力通过将与数据库相关的活动移动到单独的工作对象中来分离BLL对象。 worker对象将实体添加到数据库,并将成功或失败消息发送回BLL对象。
当我在BLL中实例化工作对象时,我使用事件+ =委托(eventhandler)语法连接工作者的事件并设置BLL的事件处理程序。
我听说如果在工作人员处置时存在内存泄漏的可能性,如果我不明确地使用 - =语法取消监听器的连接。
所有这些处理发生在Windows服务中,该服务从队列中拾取消息并调用适当的BLL对象......我担心我可能会在此过程中引入内存泄漏。
订阅事件会将订阅者的参考添加到提供者。
x.Event + = y.handler表示x现在拥有对y的引用
如果x的寿命比y长,那么在所有对x的引用都消失之前,y不能被垃圾收集。
在你的情况下,你正在倾听来自BLL工作人员的事件(如果我正确理解你的话),那么除非你明确退订,否则你有参考BLL中剩余的工作人员。
但是,如果您正在与BLL同时完成工作,那么它实际上并不重要。
你听到的是真实的。 只要您的对象订阅了来自其他可到达对象的事件,运行时就不会释放订阅对象。 如果您的应用程序在其生命周期的开头创建了一个或一小组工作对象,那么您应该可以。 如果应用程序为每个BLL对象创建一个工作对象,但是释放对BLL实例的引用,则应该也可以。
危险的是盲目地将一个实例方法订阅到一个具有长生命周期的对象的static
事件或实例事件。
如果您只在服务中订阅了该活动,那么您应该没问题。
链接地址: http://www.djcxy.com/p/51515.html上一篇: Events and Memory Leaks in .NET
下一篇: Can I make a C# object's lifetime depend on another object?