当事件触发并尝试在不再存在的对象中执行事件处理程序时会发生什么?

Dra*_*aco 5 c# events event-handling

在ClassA中,我有一个计时器对象.在这个类中,我为timer elapsed事件注册了事件处理程序.在另一个类ClassB中,我有一个用于timer elapsed事件的公共事件处理程序.所以我在ClassA中从ClassB注册事件处理程序,如下所示:

myTimer.Elapsed += ClassBInstance.TimerElapsed
Run Code Online (Sandbox Code Playgroud)

如果我要创建一个新的ClassBInstance实例,并且当ClassB的事件处理程序的前一个实例仍然与计时器的Elapsed事件绑定时,会触发计时器已过时事件会发生什么?

例如:

ClassB classBInstance = new ClassB();
myTimer.Elapsed += classBInstance.TimerElapsed

classBInstance = new ClassB();
myTimer.Elapsed += classBInstance.TimerElapsed
Run Code Online (Sandbox Code Playgroud)

Ste*_*ger 11

只要有事件已注册,AFAIK,ClassBInstance就不会被垃圾回收,因为事件会保存对它的引用.

您必须确保取消注册不再使用的所有实例事件.

重要的是注册实例是IDisposable的情况,因为在处置实例时可能会触发事件.在这种情况下,我发现最容易让实例注册自己,并在Dispose中取消注册.

  • 确实.特别是,这就是静态事件如此危险的原因; 如果你不虔诚地取消订阅,很容易保持大量的物品存活.至少实例事件会因保存支持字段的实例而死亡 - 但静态系统没有GC. (6认同)