C#ASP.NET:定时器-如何每四分之一小时执行一个命令?
我想每四分之一小时在四分之一小时执行一个命令。(24小时制) 所以在00:00:00,00:15:00,00:30:00做点什么直到23:45:00 下面是一段代码,可以帮助您理解我所说的内容C#ASP.NET:定时器-如何每四分之一小时执行一个命令?,c#,asp.net,loops,for-loop,timer,C#,Asp.net,Loops,For Loop,Timer,我想每四分之一小时在四分之一小时执行一个命令。(24小时制) 所以在00:00:00,00:15:00,00:30:00做点什么直到23:45:00 下面是一段代码,可以帮助您理解我所说的内容 protected void UpdateTimer_Tick(object sender, EventArgs e) { DateStampLabel.Text = DateTime.Now.ToString("hh:mm:ss"); //CREATE FOR LOOP TO
protected void UpdateTimer_Tick(object sender, EventArgs e)
{
DateStampLabel.Text = DateTime.Now.ToString("hh:mm:ss");
//CREATE FOR LOOP TO REFRESH AT EVERY QUARTER HOUR
if (DateStampLabel.Text == "00:00:00")
{
Response.Redirect(Request.RawUrl);
}
if (DateStampLabel.Text == "00:15:00")
{
Response.Redirect(Request.RawUrl);
}
if (DateStampLabel.Text == "00:30:00")
{
Response.Redirect(Request.RawUrl);
}
if (DateStampLabel.Text == "00:45:00")
{
Response.Redirect(Request.RawUrl);
}
...
...
...
if (DateStampLabel.Text == "23:45:00")
{
Response.Redirect(Request.RawUrl);
}
}
如何使用for循环实现相同的代码?这种事情实际上不能(也不应该)在服务器端完成。服务器端唯一合理的方法是使用计时器在后台线程上进行回调,并管理一组客户端回调 我的意思是,你说的不仅仅是一个TCP连接,还要为每个连接的远程用户长期绑定一个ASP.NET工作线程,对吗?Yikes.:-) 您可以在浏览器中使用JavaScript,而不必如此努力地占用有限的服务器资源:
window.onload = function(e){
setInterval( function() {
location.reload()
}, 900000 );
}
编辑:公认的答案似乎有很多运动部件,产生大量热量和烟雾,但没有真正的好处。我更新了我的原始伪代码,使之成为一个完整的解决方案(见上文),但也演示了另一种实现方法(见下文),它使用了不同的计时器API,但在功能上是等效的。基本上,这只需要从窗口调用一行代码。onload
事件处理程序
我在代码审查中遇到的问题包括:
- 为什么HTML标签用runat=“server”修饰
- 为什么任意运行操作96次然后停止
- 为什么要创建一个立即执行且只执行一次的计时器,只调用位于热循环中的函数(提高CPU利用率)检查时间,而它真正做的只是最终刷新页面,运行立即回调计时器以重新启动热循环
- 为什么不将计时器设置为15分钟后再回拨并刷新页面
<html>
<script language="JavaScript">
refreshInterval = 0.0333 * 60 * 1000; // minutes * seconds * ms
window.onload = function(e){
var now = new Date();
var nowUI = now.getDate() + "/" + (now.getMonth()+1) + "/" + now.getFullYear() + " @ " + now.getHours() + ":"+ now.getMinutes() + ":" + now.getSeconds();
document.getElementById('blah').innerHTML = nowUI;
setTimeout( function(){ location.reload() }, refreshInterval );
}
</script>
<head></head>
<body>
<div id='blah'>0</div>
</body>
</html>
刷新间隔=0.0333*60*1000;//分*秒*毫秒
window.onload=函数(e){
var now=新日期();
var nowUI=now.getDate()+“/”+(now.getMonth()+1)+“/”+now.getFullYear()+“@”+now.getHours()+”:“+now.getMinutes()+”:“+now.getSeconds();
document.getElementById('blah')。innerHTML=nowUI;
setTimeout(函数(){location.reload()},刷新间隔);
}
0
好的,我想出来了。这就是我想做的
<script>
function startTime() {
document.getElementById('lblClientTime').innerHTML = moment().format('HH:mm:ss');
var t = setTimeout(function () { startTime() }, 0);
refresh();
}
function refresh() {
//REFRESHES WEB FORM EVERY QUARTER HOUR
for (var i = 0; i < 96; i++) {
var startTime = moment().startOf('day').add(i * 900000).format('HH:mm:ss');
if (lblClientTime.textContent == startTime) {
location.reload();
}
}
}
</script>
<div id="lblClientTime" runat="server"></div>
</body>
函数startTime(){
document.getElementById('lblClientTime').innerHTML=moment().format('HH:mm:ss');
var t=setTimeout(函数(){startTime()},0);
刷新();
}
函数刷新(){
//每季度刷新一次WEB表单
对于(变量i=0;i<96;i++){
var startTime=moment().startOf('day').add(i*900000).format('HH:mm:ss');
if(lblClientTime.textContent==startTime){
location.reload();
}
}
}
你说的“带for循环”是什么意思?代码中没有任何循环。顺便说一下,使用UI文本元素来确定当前时间看起来不太可靠。另外,ASP.NET绝对不是用于重复执行后台任务的技术。Windows服务或计划控制台应用程序更适用。@David的评论非常有用。首先,您错误地使用了计时器滴答事件。Timer
类应该在计划的时间间隔内勾选并运行事件。你甚至不需要使用它——正如@David所说,使用windows服务或控制台应用程序,windows任务计划程序设置为每15分钟运行一次。@Joe这怎么没用?你不能在ASP.NET中做你想做的事情-你会点击页面,然后在大约60秒后请求将超时,你将永远无法通过循环的任何部分。我们正在告诉你如何以一种实际可行的方式实现你想要的。@Joe:如果你坚持以一种可能的最错误的方式做事,那么我恐怕你不会在堆栈溢出问题上找到太多“有用”的帮助。本网站的目的是分享关于软件开发的有意义和有帮助的知识,而不是为了迎合您的个人需求。提示:您可能不希望指望代码在预定时间运行到最近的一秒,即==“00:45:00”
。模糊的时间安排和其他任务可能会导致您的代码运行稍晚,并且根据您的概念设计,它找不到匹配项,并且会失败。事实上,我发现这个解决方案存在一些不寻常的问题。我在这里扩展了我的原始答案以解决这些问题。:-)