如果对象包含 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
块调用 AutoResetEvent
的 Dispose()
或 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/
我有一个 class MyClass
包含一个 AutoResetEvent
(或 ManualResetEvent
)。
public class MyClass
{
private AutoResetEvent _myWaitHandle;
public MyClass()
{
_myWaitHandle = new AutoResetEvent(false);
}
}
在正常事件过程中,程序会创建一个新的 MyClass
,使用它,然后让它脱离范围,在程序的生命周期内不再使用。但是,它从不直接或从 using
块调用 AutoResetEvent
的 Dispose()
或 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/