gpt4 book ai didi

asp.net - 检查缓存后 System.Web.HttpContext.Current 自身为空

转载 作者:行者123 更新时间:2023-12-02 17:17:03 26 4
gpt4 key购买 nike

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

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

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 应用程序中预期的那样为 null。然后,在 cacheRatesStatusObject 方法中,我检查 HttpContext.Current 是否为 null,如下所示:

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/await 时,处理请求的线程会将请求标记为未完成,然后返回到 ASP.NET 线程池。当等待稍后完成时,会分配另一个线程来运行该方法的其余部分,但是 HttpContext 不会跨线程迁移,这就是为什么在调用等待方法时会得到空引用。

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

await cacheRatesStatusObject(HttpContext.Current,  ratesStatus);

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

关于asp.net - 检查缓存后 System.Web.HttpContext.Current 自身为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10553907/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com