Мой коллега обнаружил, что мы часто можем добиться повышения производительности нашего приложения WPF, если будем кэшировать элементы управления WPF, а не создавать их заново с нуля. Конечно, использование большего объема памяти в целом может привести к падению производительности где-то еще, что будет трудно измерить, но мы предположили, что это все равно того стоит, потому что эти элементы управления занимают незначительное количество места по сравнению с другими вещами, с которыми имеет дело наше приложение.
Вот одна простая форма кэша управления:
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;
}
}
Одним из основных недостатков элементов управления кэшированием является необходимость явного освобождения их после завершения работы. Иногда вам действительно нужно сделать что-то довольно неловкое, чтобы убедиться, что они оторвались от своих родителей в нужный момент. Что еще более важно, я чувствую, что это идет вразрез со средой сбора мусора.
Я ищу стратегию. Как определить, что элемент управления (или объект) недоступен, и вернуть его в мой кеш, а не возлагать на потребителя ответственность за это?
Я рассматривал использование Финилайзера для восстановления объекта из мертвых и обратно в кеш, но эта практика обычно считается плохой по нескольким веским причинам. Кроме того, он не совсем делает то, что мне хотелось бы - он сообщает мне, когда объект собирается быть собранным, а не когда он становится недостижимым.
Что такое хороший способ?
IsAlive
, чтобы определить, была ли ссылка удалена сборщиком мусора. См. msdn.microsoft.com/en- мы/библиотека/ - person Ron Beyer   schedule 02.07.2015Dispose
, этот объект должен считаться непригодным для использования. Поскольку вы не можете контролировать, когда ваш пользователь кеша вызывает финализатор илиDispose
, вы должны считать, что он исчез, как только вы передаете объект. - person Ron Beyer   schedule 02.07.2015