类垃圾收集任务
问题描述:
我有一个运行一个任务一个MyClass类:类垃圾收集任务
MyClass
{
Run()
{
Task.Factory.StartNew(()=>
{
while(true) { }
}
}
}
现在,让我们在一个点上节目的这个类的实例没有更多的引用说。
Main()
{
var instance = new MyClass();
instance.Run();
Sleep(1000); // buy some time
instance = new MyClass(); // the previous instance has no more references
bla bla bla code ...
}
现在什么是MyClass的第一个实例的行为?它是否准备好被垃圾收集,或者因为任务而永远活着?
答
这取决于Task.Factory.StartNew()
内部的lambda究竟做了什么。
如果它类似于你的例子,它没有引用该类的任何实例成员,那么这意味着lambda委托(由Task
引用)没有引用你的类的实例,所以实例有资格进行垃圾回收。另一方面,如果lambda访问该类的任何实例成员,则lambda将为close overthis
。这意味着委托将引用实例,所以实例不会被垃圾收集。
但是在真实代码中,您通常不需要考虑这一点(除非您正在调查内存泄漏)。 GC将保留仍然可以继续使用的对象并收集剩余的对象,这正是您想要的。
答
您的任务不会引用任何对象。它没有被任何对象引用。 MyClass
是您示例代码中的红色鲱鱼。它对未参考任务是否被垃圾收集的问题没有影响。
未引用的基于委托的任务不会被垃圾收集,直到它们被执行完毕。 (除了疯狂的TaskScheduler
那只是放下任务)。
你不会通过发布这样一个不切实际的例子来帮助你。 Run()方法应该是* static *,根本不需要创建MyClass的对象。 – 2014-09-30 15:08:58