我有一个运行任务的类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第一次实施的行为是什么?它是否已准备好被垃圾收集,或者因为任务而永远存在?
答案 0 :(得分:3)
这取决于Task.Factory.StartNew()
内的lambda究竟是做什么的。
如果它类似于您的示例,并且它不引用该类的任何实例成员,那么这意味着lambda委托(由Task
引用)并不是' t引用您的类的实例,因此该实例符合垃圾回收的条件。
另一方面,如果lambda访问了类的任何实例成员,则lambda将close over this
。这意味着委托将引用该实例,因此实例不会被垃圾收集。
但在实际代码中,您通常不应该考虑这个问题(除非您正在调查内存泄漏)。 GC将保留仍然可以使用的对象并收集其余部分,这正是您想要的。
答案 1 :(得分:0)
您的任务未引用任何对象。它没有被任何对象引用。 MyClass
是示例代码中的红色鲱鱼。它对未引用的任务是否被垃圾收集的问题没有影响。
未引用的基于委托的任务在执行之前不会被垃圾回收。 (除了疯狂的TaskScheduler
只是放弃任务)。