Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net System.Web.HttpContext.Current在检查缓存后为空_Asp.net_Caching_Httpcontext_System.web - Fatal编程技术网

Asp.net System.Web.HttpContext.Current在检查缓存后为空

Asp.net System.Web.HttpContext.Current在检查缓存后为空,asp.net,caching,httpcontext,system.web,Asp.net,Caching,Httpcontext,System.web,我今天遇到了一个奇怪的问题,这对我来说毫无意义。以下是总结: 在方法中,我检查缓存项,如下所示: private async Task<RatesStatus> getRatesStatusAsync() { //... if (_currentHttpContext != null) { //Here, I am checking for a Cached item var cachedRatesStatusObj = Http

我今天遇到了一个奇怪的问题,这对我来说毫无意义。以下是总结:

在方法中,我检查缓存项,如下所示:

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);

    //...
}
private void cacheRatesStatusObject(RatesStatus ratesStatus) {

    //...

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

    //...
}

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

使用async/Wait时,处理请求的线程会将请求标记为不完整,然后返回到
ASP.NET线程池。当等待稍后完成时,会分配另一个线程来运行该方法的其余部分,但是HttpContext不会跨线程迁移,这就是为什么在调用等待方法时会得到null引用

您可以将HttpContext的引用传递给wait方法,如下所示:

await cacheRatesStatusObject(HttpContext.Current,  ratesStatus);

但是,在处理并发性和竞争条件时应该非常小心,例如,如果wait线程锁定了一个资源,而另一个请求线程试图使用它,那么线程池就会崩溃。大多数人通过创建新对象并将它们传递到参数化线程中来解决这个问题,而不是跨线程传递HttpContext的引用。

它本身不为null

HttpContext
仅以“线程静态”方式存储


正如另一个答案所建议的,只需传递实例。

传递实例很糟糕

请改用.NET 4 MemoryCache类


我注意到您的方法标记为
async
。可以肯定的是,无论您在哪里调用此方法,您都会在将
响应发送回客户端并关闭之前的某个地方执行
等待
,对吗?否则它可能只是一个竞争条件,在到达此行之前,
响应将被返回并处理,但在上面的行中仍然可用。@GuthMD是的,我在方法中的某个地方使用了
wait
。这一定是问题所在。是的,我刚刚发现了。在异步调用之前,我得到了它的一个实例:
var-httpContext=httpContext.Current然后在后面的过程中,我使用这个局部变量。这没有多大意义。为什么线程上下文没有被复制???@Aliostad:这就是它的工作方式。否则,服务于其他请求的其他线程将共享相同的状态。@这在windows上有效。在切换上下文时,将复制所有线程存储区数据。这包括HttpContext.Current。我无法理解这怎么会有不同的效果。而且在任何时候,只有一个线程为一个请求提供服务,所以这没有问题。实际上
HttpContext.Current
在等待后不为空。它在异步方法中仅为null。见这个问题: