加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – System.Web.HttpContext.Current在检查Cache后自动为

发布时间:2020-12-16 06:59:29 所属栏目:asp.Net 来源:网络整理
导读:我今天遇到了一个奇怪的问题,对我来说毫无意义.以下是摘要: 在方法内部,我检查一个缓存的项目如下: private async TaskRatesStatus getRatesStatusAsync() { //... if (_currentHttpContext != null) { //Here,I am checking for a Cached item var cached
我今天遇到了一个奇怪的问题,对我来说毫无意义.以下是摘要:

在方法内部,我检查一个缓存的项目如下:

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是否为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线程池.当awaitable稍后完成时,会分配另一个线程来运行方法的其余部分,但HttpContext不会跨线程迁移,这就是调用await方法时获得null引用的原因.

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

await cacheRatesStatusObject(HttpContext.Current,ratesStatus);

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读