删除对象的缓存实例

时间:2018-03-08 19:26:24

标签: c#

我的工厂类如下:

class SomeFactory
{
    private Dictionary<string, Boo> cache;
    private Timer cleanup;

    SomeFactory()
    {
        cache = new Dictionary<string, Boo>();
        cleanup = new Timer(60 * 1000);
        cleanup += (object sender, EventArgs e) => { cache.Clear(); }
        cleanup.Start();
    }

    public Boo GetBoo(string serial, int year)
    {
        if (!cache.ContainsKey(serial))
        {
            Boo boo = new Boo(serial, year);
            boo.inject(...); // some stuff
            cache.Add(serial, boo);
        }
        return cache[serial];
    }

    ...

}

您是否可以看到我缓存创建的Boo个实例。通常Boo是必要的,当用户想要快速查看,然后可以是免费的。实际上只编辑了Book的一个实例,并且应该存储很长时间。经过长时间使用应用程序后,可能会有很多未使用的Boo个对象。有一种设计模式可以应对这种情况吗?我的清理代码有多糟糕?

1 个答案:

答案 0 :(得分:1)

根据您的环境(特定的Web应用程序和服务),有一些特殊的方法可以进行缓存。实例的生命周期,变量范围和线程级别分离只会使这一点成为必需。

假设一个简单的本地应用程序,通常的缓存方法是使用Weak references。强引用阻止GC收集此实例。弱引用没有。但是你可以尝试从他们那里获得一个StrongReference。在这一点上,将会发生以下两件事之一:

  1. 你得到了很好的参考。
  2. 该实例已被收集。你必须从头开始重新创建它。