如果对象包含 ManualResetEvent 或 AutoResetEvent 未被关闭或处置,父对象是否仍符合 GC 条件?

If an object contains a ManualResetEvent or AutoResetEvent does not get closed or disposed, does the parent object still become eligible for GC?

我有一个 class MyClass 包含一个 AutoResetEvent (或 ManualResetEvent)。

public class MyClass
{
    private AutoResetEvent _myWaitHandle;

    public MyClass()
    {
        _myWaitHandle = new AutoResetEvent(false);
    }
}

在正常事件过程中,程序会创建一个新的 MyClass,使用它,然后让它脱离范围,在程序的生命周期内不再使用。但是,它从不直接或从 using 块调用 AutoResetEventDispose()Close() 方法。根据微软,"you should dispose of it either directly or indirectly".

我的问题是:未明确处置的 AutoResetEvent 的存在是否会阻止父 MyClass 对象被标记为符合垃圾回收条件?

简短回答:不。AutoResetEvent 对象不会阻止 MyClass 的实例被垃圾收集。

一旦 MyClass 的实例超出范围,就不会再保留对该对象的引用。因此该对象符合垃圾回收条件。

同样适用于AutoResetEvent存储在_myWaitHandle的实例,不同的是,对该对象的引用放在GC的终结队列中,以调用之前的对象Finalizer终于被垃圾收集了。

即使 AutoResetEvent 将引用存储回其 MyClass 父对象,只要两个对象都没有被其他地方引用,这两个对象都可以进行垃圾回收。

有关垃圾回收主题的详细信息,请参阅https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/