是否可以使用T类型的缓存?

时间:2011-07-08 10:43:06

标签: c# caching

将它放在缓存中时,我们可以避免将T转换为Object吗?

WeakReference需要使用对象。 System.Runtime.Caching.MemoryCache被锁定为类型对象。

自定义词典/集合会导致垃圾收集器出现问题,或者您必须运行自己的垃圾收集器(单独的线程)?

是否有可能拥有两全其美?


我知道我已经接受了答案,但现在可以使用WeakReference!看起来他们偷偷进入.Net 4。

http://msdn.microsoft.com/en-us/library/gg712911(v=VS.96).aspx


旧的功能请求。

http://connect.microsoft.com/VisualStudio/feedback/details/98270/make-a-generic-form-of-weakreference-weakreference-t-where-t-class

2 个答案:

答案 0 :(得分:4)

没有什么可以阻止你在MemoryCache周围写一个通用的包装器 - 可能有一个约束要求引用类型:

public class Cache<T> where T : class
{
    private readonly MemoryCache cache = new MemoryCache();

    public T this[string key]
    {
        get { return (T) cache[key]; }
        set { cache[key] = value; }
    }

    // etc
}

显然,唯一值得委托您真正感兴趣的MemoryCache部分。

答案 1 :(得分:1)

所以你基本上想要依赖注入只返回某些类型的缓存提供者? 是不是那种反对一切OOP?

“对象”类型的想法是任何东西都是一个对象,所以通过使用缓存来缓存对象类型的“对象”的实例,你说你可以缓存任何东西。

通过构建仅缓存某些预定类型的对象的缓存,您可以限制缓存的功能......

没有什么可以阻止您实现具有通用约束的自定义缓存提供程序,因此它只允许您缓存某些对象类型,理论上这可以为您节省大约每次检索2个“滴答”(甚至不是毫秒)。 / p>

看待这个的方法是......

对我来说更重要的是:

  1. 基于最佳实践的良好OOP
  2. 在我的缓存提供程序的生命周期内大约20毫秒
  3. 另一件事是... .net已经准备好将拳击和拆箱过程优化到极端,并且当你“缓存”某些东西时,你只是将它放在某个地方,它可以快速检索到稍后存储指向其位置的指针。

    我见过涉及通过业务流程传输4GB XML文件的解决方案,这些业务流程使用在每次调用时被销毁和重新创建的对象。重点是流程流程非常重要,而不是初始化和准备工作有道理。

    这个投射时间对你有多重要? 我很想知道更多关于需要这种速度的场景。

    作为旁注: 关于linq和实体框架等新技术,我注意到的另一件事是查询的结果是在查询需要很长时间而不是对结果产生副作用时缓存的重要因素。

    这意味着(例如): 如果我要缓存一个使用一组复杂的实体查询来创建的对象的基本“默认实例”,我不会缓存生成的对象而是查询。

    随着微软已经在做基础工作,我会问......我在缓存什么?为什么?

相关问题