C#ASP.NET:Timer - 如何每小时执行一次命令?

时间:2014-08-01 16:48:51

标签: c# asp.net loops for-loop timer

我希望每季度每小时执行一次命令。 (24小时格式)

所以在00:00:00,00:15:00,00:00: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循环实现相同的代码?

2 个答案:

答案 0 :(得分:1)

这种事情真的不能(也不应该)在服务器端完成。服务器端唯一合理的方法是使用计时器在后台线程上进行回调并管理一组客户端回调。

我的意思是,您正在谈论不仅要为每个连接的远程用户长时间连接TCP连接而且要连接ASP.NET工作线程,对吗?让人惊讶。 : - )

您可以在浏览器中使用JavaScript,而不是如此努力地占用有限的服务器资源:

window.onload = function(e){
    setInterval( function() {
        location.reload()
    }, 900000 );
}

编辑:接受的答案似乎有很多活动部件,并产生大量的热量和烟雾而没有真正的好处。我将原始的伪代码更新为完整的解决方案(上图),但也演示了另一种方法(下面),它使用不同的计时器API,但功能相同。基本上,这只需要从window.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>

答案 1 :(得分:-1)

好的我明白了。这就是我想要做的。

 <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>