Управление памятью / кэширование дорогостоящих объектов в C#

Предположим, что у меня есть следующий объект

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) и расходами на память (я не хочу, чтобы память занималась дольше, чем это необходимо).

6
задан Bobrovsky 10 June 2012 в 20:39
поделиться