如何更好地实现WPF控件缓存?

时间:2015-07-02 17:43:44

标签: c# caching collections controls garbage

我的同事发现,如果我们缓存WPF控件而不是从头开始新建它们,我们通常可以在WPF应用程序中获得性能提升。当然,使用更多内存通常会导致性能下降到其他难以衡量的地方,但我们认为这仍然值得,因为与我们的应用程序处理的其他内容相比,这些控件占用的空间非常小。 / p>

以下是控件缓存的一种简单形式:

public static class ControlCache<T> where T : Visual, new()
{
    private static Dictionary<T, bool> m_Cache = new Dictionary<T, bool>();

    public static T GetInstance()
    {
        if (m_Cache.Count == 0)
            return new T();
        else
        {
            var inst = m_Cache.First();
            m_Cache.Remove(inst.Key);
            return inst.Key;
        }
    }

    static int MAX_COUNT = 300;

    public static void Release(T ctrl)
    {
        if (ctrl != null && m_Cache.Count < MAX_COUNT && !m_Cache.ContainsKey(ctrl))
            m_Cache[ctrl] = true;
    }
}

缓存控件的一个主要缺点是需要在完成后显式释放它们。有时你真的需要做一些非常尴尬的事情,以确保它们在恰当的时刻与父母分离。 更重要的是,我认为它违背了垃圾收集环境。

我正在寻找的是一种策略。如何检测控件(或对象)无法访问并将其返回到我的缓存而不是让消费者对此负责?

我看着使用Finilizer将对象从死亡状态恢复到缓存中,但这种做法通常被认为是有好处的。它也没有完全按照我的意愿行事 - 它告诉我什么时候收集对象而不是当它无法到达时。

什么是好方法?

0 个答案:

没有答案