我有一个.net网站,一个浏览器游戏,整个游戏每10分钟“翻转一次”,翻转翻转本身需要5-10秒。我有很多GridView绑定到sqldatasource对象中相对较重的查询,其中100个玩家在转弯之间刷新。转弯之间这些网格实际上没有任何变化,所有真正的更新都发生在转弯时,所以我想在这些网格上启用缓存,因为它们是相对繁重的查询。然而,匝数每10分钟在时钟上翻转,而不是“每10分钟”。我不能只将CacheDuration设置为600,因为根据您第一次访问特定网格的时间,从那时起10分钟就可以进入另一个转弯。
我需要一种动态设置CacheDuration的方法,因此它会在时钟点击的第10分钟到期时到期。我想我可以做几件事:
我可以检查是否存在特定sqldatasource绑定的缓存,如果没有,则检查当前时间并适当设置缓存持续时间,使其在第10分钟到期。
OR
当任何页面加载到不同于最后一个回合的页面上时,可能会有一种干净的方法来清除一组sqldatasources中的所有缓存。已经有一个应用程序级变量可以跟踪游戏的开启情况并检测页面在不同的转弯处加载的时间。这可能会触发这样的缓存清除。
答案 0 :(得分:0)
Asp.Net Web应用程序是面向事件的,因此您要在页面加载时执行的操作是......
换句话说,如果没有页面正在读取缓存仍然处于活动状态并不重要,但是当有人去访问它时,您只需要确保您的上次到期事件在当前的10分钟窗口内。
如果有特定代码可以帮助我,请告诉我。邮政编码试图让我评估。
HTH
答案 1 :(得分:0)
我知道这很老了,但是我确实有这个需要,并提出了这个建议。就我而言,我需要服务器缓存在小时后的12分钟后过期。
在.aspx中的sqldatasource上设置以下属性
datasourcemode="DataSet" enablecaching="true" cachekeydependency="ckd12MinAfter" cacheexpirationpolicy="Absolute" cacheduration="Infinite"
在Page_Load代码后面
DateTime nextRefresh DateTime.Today.AddHours(DateTime.Now.Hour).AddHours(DateTime.Now.Minute > 10 ? 1 : 0).AddMinutes(12);
if (Cache["ckd12MinAfter"] == null) { Cache.Add("ckd12MinAfter", "ckd12MinAfter", null, nextRefresh, Cache.NoSlidingExpiration, CacheItemPriority.Normal, null); }
要强制客户端刷新:
<script type='javascript'>
function reloadAfterHour(r) { // force a reload at the next r minutes after the top of the hour
var now = new Date(), m = now.getMinutes(), h = now.getHours() + (m < r ? 0 : 1), t = new Date(now.toDateString())
, n = new Date(); n.setTime(t.getTime() + (h * 60 * 60 * 1000) + (r * 60 * 1000)); ms = (n.getTime() - now.getTime());
setTimeout(function () { location.reload(true); }, ms);
}
$(document).ready(function (e) { reloadAfterHour(12); });
</script>