Eri*_*c L 3 c# garbage-collection
可以说我有一个类正在做类似的事情:
public class Foo
{
private bool _forceStop = false;
private Queue<object> queue;
private void ProcessInBackground()
{
while(!forceStop )
{
Moniter.Enter(queue);
while(!_forceStop && queue.Count == 0)Moniter.Wait(queue);
object data = null;
if (!_forceStop)
data = queue.Dequeue();
Moniter.Exit(queue);
if (data != null)
processData(data);
}
}
...
}
Run Code Online (Sandbox Code Playgroud)
如果不再使用类Foo的对象,并且在该对象中_forceStop永远不会设置为true并且假设已调用ProcessInBackground,是否会收集它?
编辑:已解决,歧义增加了线程安全性.对不起,当我写这个例子时,我刚刚编写了一个场景.
(和Marc一样,我假设你指的是你所调用的对象ProcessInBackground.我也假设这queue是一个字段.)
不 - 你仍然指的是queue,这意味着将读取对象中的字段,这意味着包含的对象不能被垃圾收集.
请注意,仅仅因为对象中运行的方法不会阻止垃圾收集 - 垃圾收集器只关心是否有可能使用引用本身,或者是否正在读取对象中的字段.演示代码显示:
using System;
using System.Threading;
public class OddFinalizer
{
int field;
public OddFinalizer(int field)
{
this.field = field;
}
~OddFinalizer()
{
Console.WriteLine("OddFinalizer");
}
public void Work()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("In loop before last access...");
GC.Collect();
GC.WaitForPendingFinalizers();
Thread.Sleep(1000);
}
Console.WriteLine("Field value: {0}", field);
for (int i = 0; i < 5; i++)
{
Console.WriteLine("In loop after last access...");
GC.Collect();
GC.WaitForPendingFinalizers();
Thread.Sleep(1000);
}
}
static void Main(string[] args)
{
new OddFinalizer(10).Work();
}
}
Run Code Online (Sandbox Code Playgroud)
结果(使用/ o +编译,不在调试器中运行):
In loop before last access..
In loop before last access..
In loop before last access..
In loop before last access..
In loop before last access..
Field value: 10
In loop after last access...
OddFinalizer
In loop after last access...
In loop after last access...
In loop after last access...
In loop after last access...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
585 次 |
| 最近记录: |