C#ASP.NET:定时器-如何每四分之一小时执行一个命令?

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

我想每四分之一小时在四分之一小时执行一个命令。(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 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分钟后再回拨并刷新页面

我在下面提供了一个完整的函数示例,它以偶数间隔重新加载页面。这与setTimeout或setInterval的工作方式完全相同

我将其设置为每隔几秒钟,只是为了演示效果。但真正的问题是页面加载,一旦UI准备好,就会设置一个计时器回调函数,该函数只在间隔时间过后刷新页面。你不必坐在热循环中检查时间、提高CPU利用率(消耗电池寿命、从其他应用程序中窃取CPU等)

页面再次完成呈现后,将再次设置页面刷新计时器回调。这里实际上只有一行相关的代码——setTimeout调用。其余部分只是在页面加载时显示当前时间戳,以证明刷新按预期工作

<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”
。模糊的时间安排和其他任务可能会导致您的代码运行稍晚,并且根据您的概念设计,它找不到匹配项,并且会失败。事实上,我发现这个解决方案存在一些不寻常的问题。我在这里扩展了我的原始答案以解决这些问题。:-)