【问题标题】:Accessing the ASP.NET Cache from a Separate Thread?从单独的线程访问 ASP.NET 缓存?
【发布时间】:2011-01-27 01:24:41
【问题描述】:

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

但是,自从向我的项目添加线程后,线程在尝试检索此对象时都会出现空引用异常。

有没有其他方法可以访问它、解决方法或我可以使用的其他缓存?

【问题讨论】:

  • 它不是线程安全的。查看你最喜欢的 C# 编程书籍中的 lock 关键字。
  • “自从添加线程”到底是什么意思?
  • @nobugz: System.Web.Caching.Cache 是线程安全的。这里不需要lock。
  • @aaro: 属性是线程安全的吗?看起来不像。
  • @nobugz: HttpContext.Current 是线程本地和只读的,所以基本上,是的,它是线程安全的,尽管由于下面 binarycoder 指出的原因它也是错误的。 HttpRuntime.Cache 是相同的,但可以全局访问;它不是同步的,但它也是不可变的,因此您不需要使用任何显式锁。实际上,ASP.NET HttpContext.Cache 只是对HttpRuntime.Cache 的引用,所以它必须是线程安全的,否则 ASP.NET 请求会不断相互挤压。

标签: c# asp.net caching


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

如果您的项目是 ASP.NET 项目,那么它甚至在您“添加线程”之前就是多线程的。

在引用 HttpContext.Current.Cache 之前检查 HttpContext.Current 是否为非空。

另外,请发布您收到的完整异常,并向我们展示引用缓存的代码。

【讨论】:

    猜你喜欢
    • 2011-11-21
    • 2019-01-05
    • 1970-01-01
    • 2019-05-30
    • 2016-08-24
    • 1970-01-01
    • 2012-07-01
    • 2019-07-19
    • 2014-12-27
    相关资源
    最近更新 更多