System.Web.Caching.Cache是​​否处理从缓存中清除的对象?

Ser*_*sev 7 c# asp.net-mvc caching thread-safety asp.net-mvc-3

背景:我正在编写ASP.NET MVC 3 Web应用程序.List<MyObject>由于方便的自动过期功能和线程安全性,我有一个(实际上是几个列表)我想要保留在缓存中的对象.

每个对象内部都包含System.Threading.Semaphore用于内部服务器推送实现的实例.

所以我想知道如果将对象放入缓存中,它将如何改变对象的生命周期?如果缓存实际上处理它清除/等的对象,这可能会导致线程/ NullReferenceExceptions出现问题.也许其他一些明显的理由不这样做?

TIA.

Jam*_*unt 9

当缓存因任何原因从缓存中弹出时,缓存不会显式处置对象.您可以通过测试来证明这一点,但如果是这种情况则会出现在文档中,而不是:

http://msdn.microsoft.com/en-us/library/system.web.caching.cache.aspx

高速缓存中对象的生命周期可以通过在高速缓存中扩展,因为高速缓存持有对它们的引用.如果你想避免这种情况,你可以改为缓存一个弱引用.

http://msdn.microsoft.com/en-us/library/system.weakreference.aspx

如果这样做,那么将引用存储在缓存中应该没有生命周期的影响.

有一点需要考虑 - 你说你想使用缓存,因为它是线程安全的.您应该知道缓存对象本身是线程安全的,但是如果您在缓存中缓存一个非线程安全对象,它将不会使缓存对象本身自动线程安全.特别List<T>是不是线程安全的,将其存储在缓存中不会改变这一点.如果要确保线程安全,请使用并发集合.

  • 应该注意的是,如果需要,可以通过指定删除回调方法来处理对象. (3认同)