今天我遇到了一个奇怪的问题,这对我来说毫无意义。总结如下:
在方法内部,我检查缓存的项目,如下所示:
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
为空或不如下:
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 thread pool
。当等待稍后完成时,会分配另一个线程来运行该方法的其余部分,但是 HttpContext 不会跨线程迁移,这就是为什么在调用等待方法时会得到空引用。
您可以将 HttpContext 的引用传递给await 方法,如下所示:
await cacheRatesStatusObject(HttpContext.Current, ratesStatus);
但是,您应该非常小心地处理并发和竞争条件,例如,如果等待线程锁定资源并且另一个请求线程尝试使用它,那么您的线程池就会繁荣。大多数人通过创建新对象并将它们传递到参数化线程中来解决此问题,而不是跨线程传递 HttpContext 的引用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)