从单独的线程访问ASP.NET缓存?

17

通常我有一个静态类可以读写 HttpContext.Current.Cache

但是自从在我的项目中添加了线程后,当尝试检索此对象时,所有线程都会收到空引用异常。

是否有其他访问该对象的方法、解决方法或其他缓存可以使用?


2
它不是线程安全的。请查看您最喜爱的C#编程书中的锁定关键字。 - Hans Passant
你说的“since adding threading”具体是什么意思? - Andras Vass
@nobugz:System.Web.Caching.Cache 是线程安全的。这里不需要 lock - Aaronaught
@aaro: 这个属性是线程安全的吗?看起来不是。 - Hans Passant
3
@nobugz:HttpContext.Current 是线程本地的且只读,所以基本上它是线程安全的,尽管如下二进制编码器指出的那样,它也是错误的。HttpRuntime.Cache 同样是线程安全的,但它是全局可访问的;它没有同步,但它也是不可变的,因此您不需要使用任何显式锁定。实际上,ASP.NET 的 HttpContext.Cache 只是对 HttpRuntime.Cache 的一个引用,因此它必须是线程安全的,否则 ASP.NET 请求将会不断互相冲突。 - Aaronaught
2个回答

36

System.Web.Cache 对象本身是线程安全的。

问题在于如何以一种适用于整个应用程序的方式获取对它的引用。除非在处理 ASP.NET 请求的线程上调用它,否则 HttpContext.Current 将返回 null。获取 Cache 的另一种方法是通过静态属性 System.Web.HttpRuntime.Cache。这将避免使用 HttpContext 带来的问题。


哦,太酷了,我不知道为什么我从来没有接触过HttpRuntime... +1,删除我的答案。 :) - Tanzelax
1
+1:这是正确的答案。以下是一些详细信息:http://weblogs.asp.net/pjohnson/archive/2006/02/06/437559.aspx - Brian MacKay
pjohnson页面已经迁移到http://weblogs.asp.net/pjohnson/httpruntime-cache-vs-httpcontext-current-cache。重定向无效,花了一段时间才在wayback机器上找到它。 - goodeye

2
如果您的项目是ASP.NET项目,那么在您“添加线程”之前它就是多线程的。
在引用HttpContext.Current.Cache之前,请检查HttpContext.Current是否为非空。
此外,请发布完整的异常信息,并向我们展示引用缓存的代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接