鉴于以下情况...
public MyClass
{
public void MyClass()
{
var myWorkerClass = new MyWorkerClass();
myWorkerClass.DoSomething();
// and exit quickly
}
}
public MyWorkerClass()
{
public void DoSomething()
{
ThreadPool.QueueUserWorkItem(() =>
{
SomeLongRunningProcess();
});
}
public static void SomeLongRunningProcess()
{
// Something that takes a long time
}
}
MyWorkerClass和MyClass什么时候有资格进行垃圾回收?
我的想法是MyWorkClass.DoSomething()中的匿名函数将存储在MyWorkerClass的局部变量声明空间中。这将足以在线程完成之前将它们保留下来。这样对吗?
最佳答案
MyClass应该有资格立即被收集。在SomeLongRunningProcess()完成之后,MyWorkerClass将有资格进行收集(假设上述方法引用了“this”,在您的示例中没有)。
按照您的代码现在的样子,这两个实例都可以立即使用。
如果希望MyClass或MyWorkerClass徘徊,请从SomeLongRunningProcess或调用它的闭包中引用它。