System.Web.HttpContext.Current空本身检查的缓存后(System.Web

2019-09-17 04:09发布

我今天做没有意义的,我遇到了一个奇怪的问题。 这是一个总结:

里面的方法,我检查如下缓存项:

private async Task<RatesStatus> getRatesStatusAsync() {

    //...

    if (_currentHttpContext != null) {

        //Here, I am checking for a Cached item
        var cachedRatesStatusObj = HttpContext.Current.Cache[Constants.RATESSTATUS_CACHE_KEY_NAME];
        if (cachedRatesStatusObj != null)
            return (RatesStatus)cachedRatesStatusObj;
    }

    //...

    cacheRatesStatusObject(ratesStatus);

    //...
}

在这里, HttpContext.Current如预期的ASP.NET应用程序中不为空。 然后,里面cacheRatesStatusObject方法,我检查是否HttpContext.Current为空或不是如下:

private void cacheRatesStatusObject(RatesStatus ratesStatus) {

    //...

    //Seeing if HttpContext.Current is null or not first.
    //and it is null here...
    if (HttpContext.Current == null)
        return;

    //...
}

它是空在那里。 不知道这里发生了什么。 有什么想法吗?

Answer 1:

当您使用异步/的await,线程处理请求,标志着该请求不完整,然后返回到ASP.NET thread pool 。 当awaitable后完成,另一个线程分配给运行的方法的其余部分,但HttpContext的不跨线程迁移,这就是为什么你调用await方法时,你得到空引用。

你可以传递的HttpContext到await方法,像这样的一个参考:

await cacheRatesStatusObject(HttpContext.Current,  ratesStatus);

但是,如果AWAIT线程锁定的资源和其他请求的线程试图使用它,然后你的线程池出现热潮,你应该非常小心处理并发和比赛条件,例如。 大多数人通过创建新的对象,并将其传递到paramaterized线程而不是线程之间传递的HttpContext的参考解决这个问题。



Answer 2:

通过实例很烂。

使用.NET 4的MemoryCache类来代替。

http://stevescodingblog.co.uk/net4-caching-with-mvc/



Answer 3:

它不空本身。

HttpContext只存储在一个“线程静态”方式。

正如其他回答表明,你只需要把这个实例。



文章来源: System.Web.HttpContext.Current nulls itself after checking for a Cache