帮助c#计时器

时间:2011-08-16 15:31:30

标签: c# timer

我在c#中有这个计时器:

public class HomeController : Controller
{
    public int count = 0;
    public ActionResult Index()
    {
        Timer timer = new Timer();
        timer.Interval = 1000;
        timer.Elapsed += new ElapsedEventHandler(onTimer);
        timer.Start();
        return View();
    }
    public void onTimer(Object source, ElapsedEventArgs e)
    {
        count++;
    }  
    [HttpPost]
    public JsonResult CheckStatus()
    {
        return Json(count);
    }

这是我的观点:

<script type="text/javascript">
$(function () {
    // poll every 5 seconds
    setInterval('checkStatus()', 3000);
});

function checkStatus() {
    $.ajax({
        url: 'Home/CheckStatus',
        type: 'POST',
        dataType: 'json',
        success: function (xhr_data) {
            document.getElementById("test").innerText = xhr_data;
        }
    });
}

为什么它一直显示我(跑步时)只有0?为什么不告诉我:0,1,2等......?

3 个答案:

答案 0 :(得分:3)

每次发出请求时都会创建一个新的控制器实例。因此,重复的AJAX调用只会得到0,因为这是count值被初始化为。

可能会有其他控制器(有计时器运行)浮动,直到GC运行以收集它们,但它们对实际处理每个单独请求的新控制器没有任何影响。

我不知道您尝试使用此代码解决了什么问题,但您是否调查了setTimeoutsetInterval javascript方法?它们提供客户端计时器服务,可能非常适合您的任务。

如果您需要持久的服务器端数据,那么有很多选项,包括:

哪些(如果有的话)适合您,取决于您尝试解决的实际问题。

答案 1 :(得分:2)

因为您的计时器将无法在页面生命周期中存活,假设这是ASP.NET。每次发生回发时,都会给出一个新的实例。

我不确定如何让计时器工作,但是为了在回调中保持持久性,你可以使用View State,Session或Cache之类的东西。

答案 2 :(得分:0)

每次发出请求时都不会对控制器进行实例化,因此每次发出请求时该值都为零?

如果需要全局计数器,请使用Application或静态字段。如果您希望它按每个用户使用会话计数。