我正在使用C#中的Actions,想知道当我希望GC正确清理对象时,是否需要将Action实例设置为null?以下是示例:
public class A
{
public Action a;
}
public class B
{
public string str;
}
public class C
{
public void DoSomething()
{
A aClass = new A();
B bClass = new B();
aClass.a = () => { bClass.str = "Hello"; }
}
}
在我的Main方法中,我有类似这样的代码:
public void Main(...)
{
C cClass = new C();
cClass.DoSomething();
Console.WriteLine("At this point I dont need object A or B anymore so I would like the GC to collect them automatically.");
Console.WriteLine("Therefore I am giving GC time by letting my app sleep");
Thread.Sleep(3000000);
Console.WriteLine("The app was propably sleeping long enough for GC to have tried collecting objects at least once but I am not sure if A and B objects have really been collected");
}
}
请阅读Console.WriteLine文本,它将帮助您理解我在这里提出的问题。
如果我将我的GC理解应用于此示例,则GC永远不会收集对象,因为A不能被销毁,因为它持有B的实例。我是正确的吗?
如何正确地收集这两个对象?我需要将Actions的实例设置为null,以便让GC在应用程序结束之前收集对象,还是已经存在某种非常智能的机制可以销毁具有类似A和B的Actions的对象?
编辑:问题是关于GC和正确收集对象。它不是关于调用方法collect()。
GC.Collect()
,然后再调用GC.WaitForPendingFinalizers()
来确保 GC 已经运行。长时间的睡眠并不能保证 GC 会运行。 - dlevThread.Sleep
不会触发 GC - 它通常只在无法在第 0 代中进行分配时运行。您可以使用GC.Collect()
强制运行它。 - Lee