C#中昂贵对象的内存管理/缓存

Bob*_*sky 6 c# caching garbage-collection memory-management weak-references

假设我有以下对象

public class MyClass
{
    public ReadOnlyDictionary<T, V> Dict
    {
        get
        {
            return createDictionary();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

假设这ReadOnlyDictionary是一个只读包装器Dictionary<T, V>.

createDictionary方法需要很长时间才能完成,并且返回的字典相对较大.

显然,我想实现某种缓存,所以我可以重用结果,createDictionary但我也不想滥用垃圾收集器并使用很多内存.

我想WeakReference用于字典但不确定这是否是最好的方法.

你会推荐什么?如何正确处理可能被多次调用的昂贵方法的结果?

更新:

我对C#2.0库(单个DLL,非可视化)的建议感兴趣.该库可能在​​Web应用程序的桌面中使用.

更新2:

该问题也适用于只读对象.我从更改属性的值DictionaryReadOnlyDictionary.

更新3:

T是比较简单的类型(字符串,例如).这V是一个自定义类.您可能认为V创建的实例成本很高.字典可能包含0到数千个元素.

假定代码从单个线程或具有外部同步机制的多个线程访问.

如果没有人使用字典,那么我很好.我试图找到时间之间的平衡(我想以某种方式缓存结果createDictionary)和内存开销(我不想让内存占用超过必要的时间).

Mar*_*tus 1

有四种主要机制可供您使用(Lazy 是 4.0 中的,所以它不是选项)

  1. 惰性初始化
  2. 虚拟代理
  3. 价值持有者

每个都有它自己的优点。

我建议使用值持有者,它会在第一次调用持有者的 GetValue 方法时填充字典。那么您可以根据需要使用该值,并且只执行一次并且仅在需要时执行。

欲了解更多信息,请参阅马丁·福勒斯页面