2014-09-30 83 views
0

我有一个运行一个任务一个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

你不会通过发布这样一个不切实际的例子来帮助你。 Run()方法应该是* static *,根本不需要创建MyClass的对象。 – 2014-09-30 15:08:58

回答

3

这取决于Task.Factory.StartNew()内部的lambda究竟做了什么。

如果它类似于你的例子,它没有引用该类的任何实例成员,那么这意味着lambda委托(由Task引用)没有引用你的类的实例,所以实例有资格进行垃圾回收。另一方面,如果lambda访问该类的任何实例成员,则lambda将为close overthis。这意味着委托将引用实例,所以实例不会被垃圾收集。

但是在真实代码中,您通常不需要考虑这一点(除非您正在调查内存泄漏)。 GC将保留仍然可以继续使用的对象并收集剩余的对象,这正是您想要的。

0

您的任务不会引用任何对象。它没有被任何对象引用。 MyClass是您示例代码中的红色鲱鱼。它对未参考任务是否被垃圾收集的问题没有影响。

未引用的基于委托的任务不会被垃圾收集,直到它们被执行完毕。 (除了疯狂的TaskScheduler那只是放下任务)。