首先,我认为我应该链接到这篇文章,它几乎完成了我的任务。
我的问题是:我的站点上有一个用户控件,需要缓存一些数据至少15分钟,然后再从DB中提取数据。问题是拉大约需要7-10秒从DB中提取结果。
我的想法是,我可以将缓存设置为大约两个小时,然后在缓存对象中有一个属性来表示对象何时加载(让我们将其称为LoadDate属性)。然后,我将让代码提取缓存的对象。
在我之前链接的文章中,答案完美地设置了缓存更新,但我不认为它是异步的。这个问题首先是使用Page.RegisterAsyncTask异步地完成的。问题1,,我似乎找不到任何信息,说明这是否允许异步进程继续,即使用户离开了页面?
问题2,,有人对如何做到这一点有一个好主意吗?我有一些代码,但它已经变得非常长,而且似乎仍然不能正常工作。
发布于 2011-07-14 19:22:04
问题1 (RegisterAsyncTask)
非常重要的是要记住:从客户机/用户/浏览器的角度来看,这不会使请求异步。如果要注册的任务需要30秒才能完成,浏览器仍将等待30+秒。RegisterAsyncTask所做的唯一一件事就是在异步调用期间将您的工作线程释放回IIS。不要误解我的意思--这仍然是一项有价值和重要的技术。但是,对于发出特定请求的用户/浏览器来说,它不会对响应时间产生明显的影响。
问题2
这可能不是解决您的问题的最佳解决方案,但我在过去使用过的东西可能会有所帮助:当您使用将项添加到缓存中。时,指定一个absoluteExpiration和一个onRemoveCallback。创建一个获取新数据的函数,并将其放入缓存中:这是您应该作为onRemoveCallback传递的函数。这样,每次缓存数据过期时,都会发生回调,将新数据放回缓存;因为回调是缓存过期事件的结果,所以没有用户请求等待缓存新数据所需的7-10秒。
这不是一个完美的设计。一些注意事项:
对不起,我没有一个防弹的答案给你(我要盯着这条线--也许还有另一条!)但是正如我所说的,我已经成功地使用了这种方法,除非您的系统负载非常高,否则它应该有助于解决这个问题。
编辑:基于OP的评论,对上述方法的一个轻微的扭曲
您可以缓存一个虚拟值,并使用它触发您的refreshCachedData函数。它并不特别优雅,但我以前也这样做过。:)
详细说明:将实际缓存的数据保存在缓存中,键为"MyData",没有过期,也没有onRemoveCallback。每次在"MyData“中缓存新数据时,您还会向缓存中添加一个虚拟值:"MyDataRebuildTrigger",过期15分钟,使用重新构建实际缓存数据的onRemoveCallback。这样,当"MyData“为空时,就没有7-10秒的间隙了。
https://stackoverflow.com/questions/6697397
复制相似问题