我的同事发现,如果我们缓存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将对象从死亡状态恢复到缓存中,但这种做法通常被认为是有好处的。它也没有完全按照我的意愿行事 - 它告诉我什么时候收集对象而不是当它无法到达时。
什么是好方法?