我有一个ASP.NET(4.5+)应用程序,它从Page_Load调用异步任务以获取页面的数据。我希望每15分钟刷新一次数据而不输入任何用户。
首先,我尝试使用计时器并在计时器函数中调用Page.ExecuteRegisteredAsyncTasks()。没有错误,但我的异步任务永远不会被调用。就在Page_Load期间。
然后我尝试了各种技术来强制重新加载页面,这会导致再次调用Page_Load,但每次尝试都会导致抛出异常,说当时无法使用该技术。
我想每15分钟调用一次的C#方法被定义为私有异步任务。
每15分钟调用此方法的最佳方法是什么?正如我上面所写,它是从Page_Load成功调用的,但从未再次调用。
答案 0 :(得分:0)
您将需要使用某种工作者。如果你有一个计时器,那么每次刷新页面时,计时器都会重置,你可以使用一个会话变量来跟踪。这只是页面生命周期的本质。
另一种方法是创建服务,您可以使用ASMX服务并从客户端提取数据。使用HTML5 Local Storage跟踪上次更新的时间,甚至" nextTimeToUpdate"从现在开始存储15分钟以上。设置每1分钟一次的时间来检查当前的DateTime,如果> = nextTimeToUpdate然后通过AJAX触发请求。
由于即使在浏览器关闭后本地存储仍然存在,当用户下次访问该页面时,数据仍将存在。只有当用户关闭机器/清理浏览器时,数据才会丢失。
修改强>
假设您想要在服务器端触发这些事件。将异步任务移动到新类中,实例化或将其注入所需页面。
Scott Hanselman有一篇关于How to run Background tasks in ASP.NET的文章。一个值得注意的图书馆Hangfire
答案 1 :(得分:0)
你必须使用Timer,我认为这是最好的方法。
请按照以下步骤操作:
在设计页面中:
<asp:ScriptManager ID="manager" runat="server" />
<asp:Timer ID="timer" runat="server" Interval="900000" OnTick="timer_Tick" />
然后创建一些函数(例如MyFunc())和你的代码:
protected void Page_Load(object sender, EventArgs e){
MyFunc();
}
protected void timer_Tick(object sender, EventArgs e){
MyFunc();
}
protected void MyFunc(){
//do all actions, what you need, here
}