本文介绍了.NET 对象事件和处置/GC的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在 Joel Coehoorns 出色的回答之后,我明白我需要更具体,所以我修改了我的代码以更接近我想要理解的东西......
事件: 据我了解,在后台,事件是 EventHandlers 又名委托的集合",当事件引发时将被执行.所以对我来说,这意味着如果对象 Y 有事件 E 并且对象 X 订阅了事件 YE,那么 Y 将引用 X,因为Y必须执行位于X的方法,那样X不能被收集,那我明白了.
//在a中创建对这个(b)的引用.a.EventHappened += new EventHandler(this.HandleEvent);
但这不是 Joel Coehoorn 所说的……
<块引用>但是,事件存在一个问题,即有时人们喜欢将 IDisposable 与具有事件的类型一起使用.问题是当一个类型 X 订阅另一个类型 Y 的事件时,X 现在有一个对 Y 的引用.这个引用会阻止 Y 被收集.
我不明白 X 将如何引用 Y ???
我对我的例子做了一些修改,以更接近地说明我的情况:
class Service//假设是windows服务,必须24/7在线{一个_a;无效开始(){CustomNotificationSystem.OnEventRaised += new EventHandler(CustomNotificationSystemHandler)_a = 新的 A();B b1 = 新 B(_a);B b2 = 新 B(_a);C c1 = 新 C(_a);C c2 = 新 C(_a);}无效 CustomNotificationSystemHandler(args){//_a.Dispose();由**编辑2***添加a.处置();_a = 新的 A();/*b1,b2,c1,c2 将继续存在,我知道他们现在会订阅到 _a 的前一个实例,我可以,但是在那个例子中,现在,没有人引用 _a 的前一个实例(b 不包含对 _a 的引用)并由我的理论上,以前的 _a 实例,现在可能会被收集……或者我失踪了某物???*
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!