Mic*_*ael 8 c# events garbage-collection finalizer
我有这段代码
public class Publisher
{
public event EventHandler SomeEvent;
}
public class Subscriber
{
public static int Count;
public Subscriber(Publisher publisher)
{
publisher.SomeEvent += new EventHandler(publisher_SomeEvent);
}
~Subscriber()
{
Subscriber.Count++;
}
private void publisher_SomeEvent(object sender, EventArgs e)
{
// TODO
}
}
Run Code Online (Sandbox Code Playgroud)
在我的应用程序的主要方法中我有
static void Main(string[] args)
{
Publisher publisher = new Publisher();
for (int i = 0; i < 10; i++)
{
Subscriber subscriber = new Subscriber(publisher);
subscriber = null;
}
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine(Subscriber.Count.ToString());
}
Run Code Online (Sandbox Code Playgroud)
如果我运行它,我将输出0.如果我从代码中删除事件订阅,我将得到期望的结果 - 这是10.
当调用GC.Collect()时,gc被强制启动垃圾收集.因为订阅者已在其中定义了Finalize,GC将暂停收集,直到finalizequeue为空 - 即所有订阅实例将调用其Finalize()方法之后(如果我的假设错误,请纠正我).在下一行调用GC.WaitForPendingFinalizers(),它将有效地暂停执行,直到终结器队列为空.现在,因为我们输出0作为输出,我认为没有调用Finalize(),这使我相信GC没有标记要收集的订阅者实例,因此没有调用Finalizer()方法.
所以我有2个问题
我唯一的猜测是,由于有10个订阅者实例正在引用同一个发布者实例,因此当GC收集发生时,它会看到有其他对发布者的引用,因此无法收集它,因此所有订阅与发布者一起的实例正被移动到下一代,因此在代码执行到达Console.WriteLine(Subscriber.Count.ToString())时不会发生垃圾收集,也不会调用Finalize()
我是对的还是我错过了什么?
| 归档时间: |
|
| 查看次数: |
2329 次 |
| 最近记录: |