我有一个包含计时器的类型,该计时器每2秒触发一次实例方法。我的问题是,当对象实例超出范围时,不会收集对象,因为计时器线程维护一个引用。
我的问题是;是否可以在运行时确定对象具有多少引用,如果引用计数为1,则引用对同一对象的循环引用?基本上我在考虑向定时器调用添加代码以停止定时器,并且如果对象只有1个循环引用,则将堆栈引用设置为null。
由于
public class TypeWithSelfRefresh<T>
{
private readonly IList<T> _cache = new List<T>();
private Timer _refreshTimer;
public TypeWithSelfRefresh()
{
_refreshTimer = new Timer(delegate { ClearCache();},null,2000,2000);
}
public void ClearCache()
{
lock (_cache)
{
_cache.Clear();
}
}
public void Add(T item)
{
lock (_cache)
{
_cache.Add(item);
}
}
public IEnumerable<T> GetItems()
{
lock (_cache)
{
foreach (T item in _cache)
{
yield return item;
}
}
}
}
答案 0 :(得分:2)
答案 1 :(得分:2)
问题不在于循环引用。 .NET框架处理得很好。问题是您正在处理一个对象,该对象出于某种原因(Timer)而没有正确处理它。
任何计时器必须实现Dispose的原因很简单。为了它的工作,它必须向后台运行计时器的底层机制提供自己的引用。这是一个你无法直接控制的参考。要删除该引用,您必须调用Dispose。
答案 2 :(得分:0)
循环引用不应阻止GC收集对象,因为它无法访问。是什么让你觉得它没有被收集?你打电话给GC.Collect
吗?