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

ASP.NET异步隐藏

发布时间:2020-12-16 09:49:08 所属栏目:asp.Net 来源:网络整理
导读:首先,我想我应该链接到 this article,这几乎完成了我的工作. 这是我的问题: 我的网站上有一个用户控件,需要缓存一些数据至少15分钟,然后再从数据库中提取数据.问题是从数据库拉取结果需要大约7-10秒. 我的想法是我可以将缓存设置为两个小时,然后在缓存对象
首先,我想我应该链接到 this article,这几乎完成了我的工作.

这是我的问题:
我的网站上有一个用户控件,需要缓存一些数据至少15分钟,然后再从数据库中提取数据.问题是从数据库拉取结果需要大约7-10秒.

我的想法是我可以将缓存设置为两个小时,然后在缓存对象中有一个属性来说明加载对象的时间(让我们称之为LoadDate属性).然后我会让代码拉出缓存的对象.

>如果它为null,我别无选择,只能同步提取数据,然后加载我的用户控件
>如果它不为null,我想继续将数据从缓存对象加载到我的用户控件.然后我会检查LoadDate属性.如果是15分钟或更长时间,则设置异步进程以重新加载缓存.

>在更新时需要有一个锁定缓存对象的进程
>我需要一个if语句,说明对象是否被锁定,然后忘记更新它.这将是其他用户的后续页面加载 – 因为第一个用户已经在更新缓存,我不希望一遍又一遍地更新缓存;它应该只是第一次通话更新.请记住,在我进行缓存检查之前,我已经加载了用户控件

在我之前链接的文章中,答案完美地设置了缓存更新,但我不相信它是异步的.问题始于使用Page.RegisterAsyncTask异步执行. [问题1]即使用户离开页面,我似乎无法找到有关这是否允许异步进程继续的任何信息?

[问题2]任何人都知道如何做到这一点?我有一些代码,但它已经变得非常长,但似乎仍然无法正常工作.

解决方法

问题1(RegisterAsyncTask)

要记住非常重要的事情:从客户端/用户/浏览器的角度来看,这不会使请求异步.如果您注册的任务需要30秒才能完成,浏览器仍将等待30秒. RegisterAsyncTask唯一能做的就是在异步调用期间将工作线程释放回IIS.不要误会我的意思 – 这仍然是一项宝贵而重要的技术.但是,对于发出该特定请求的用户/浏览器,它对响应时间没有明显影响.

问题2

这可能不是解决您问题的最佳解决方案,但是我过去使用过的东西可能有所帮助:当您add your item to the cache时,指定absoluteExpiration和onRemoveCallback.创建一个获取新数据的函数,并将其放入缓存中:这是您应该作为onRemoveCallback传递的函数.这样,每次缓存数据到期时,都会发生回调以将新数据放回缓存中;因为回调是由于缓存过期事件而发生的,所以没有用户请求等待缓存新数据所花费的7-10秒.

这不是一个完美的设计.一些警告:

>如何最初加载缓存?最简单的方法是从Application_Start函数调用缓存加载器函数.
>每隔15分钟,将有一个7-10秒的窗口,缓存为空.在此期间的任何请求都需要自己获取数据.根据您的系统使用模式,这可能是一个可接受的小窗口,并且在此期间只会发生很少的请求.
>当缓存的项目到期时,无法保证缓存回调.如果系统负载极重,则在触发回调并重新加载缓存之前可能会有延迟.同样,根据您的系统使用情况,这可能是一个非问题或重大问题.

对不起,我没有给你一个防弹的答案(我会留意这个帖子 – 也许是另一个SO’er呢!).但正如我所说,我已经使用这种方法取得了一些成功,除非你的系统负载非常高,否则应该有助于解决这个问题.

编辑:根据OP的评论略微扭曲上述方法

您可以缓存一个虚拟值,并纯粹用它来触发您的refreshCachedData函数.它不是特别优雅,但我之前也做过.

(编辑:李大同)

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

    推荐文章
      热点阅读