Предположим, что у меня есть следующий объект
public class MyClass
{
public ReadOnlyDictionary<T, V> Dict
{
get
{
return createDictionary();
}
}
}
Предположим, что ReadOnlyDictionary
является оболочкой только для чтения вокруг Dictionary
.
Метод createDictionary
занимает значительное время для заполнения, а возвращаемый словарь относительно велик.
Очевидно, что я хочу реализовать какое-то кэширование, чтобы я мог повторно использовать результат createDictionary
, но также я не хочу злоупотреблять сборщиком мусора и использовать много памяти.
Я думал использовать WeakReference
для словаря, но не уверен, что это лучший подход.
Что бы вы порекомендовали? Как правильно обрабатывать результат дорогостоящего метода, который может быть вызван несколько раз?
ОБНОВЛЕНИЕ:
Меня интересует совет по библиотеке C# 2.0 (одна DLL, не-визуальный). Библиотека может использоваться в рабочем столе веб-приложения.
ОБНОВЛЕНИЕ 2:
Этот вопрос актуален и для объектов, доступных только для чтения. Я изменил значение свойства с Dictionary
на ReadOnlyDictionary
.
ОБНОВЛЕНИЕ 3:
T
является относительно простым типом (строка, например). V
является пользовательским классом. Можно предположить, что создание экземпляра V
обходится дорого. Словарь может содержать от 0 до пары тысяч элементов.
Предполагается, что доступ к коду осуществляется из одного потока или из нескольких потоков с внешним механизмом синхронизации.
Я в порядке, если словарь является GC-ed, когда его никто не использует. Я пытаюсь найти баланс между временем (я хочу как-то кэшировать результат createDictionary
) и расходами на память (я не хочу, чтобы память занималась дольше, чем это необходимо).