自引用计时器/无法收集的对象

时间:2009-08-28 09:01:11

标签: c#

我有一个包含计时器的类型,该计时器每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;
            }
        }
    }
}

3 个答案:

答案 0 :(得分:2)

看看WeakReference

答案 1 :(得分:2)

问题不在于循环引用。 .NET框架处理得很好。问题是您正在处理一个对象,该对象出于某种原因(Timer)而没有正确处理它。

任何计时器必须实现Dispose的原因很简单。为了它的工作,它必须向后台运行计时器的底层机制提供自己的引用。这是一个你无法直接控制的参考。要删除该引用,您必须调用Dispose。

答案 2 :(得分:0)

循环引用不应阻止GC收集对象,因为它无法访问。是什么让你觉得它没有被收集?你打电话给GC.Collect吗?