我在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等......?
答案 0 :(得分:3)
每次发出请求时都会创建一个新的控制器实例。因此,重复的AJAX调用只会得到0,因为这是count
值被初始化为。
可能会有其他控制器(有计时器运行)浮动,直到GC运行以收集它们,但它们对实际处理每个单独请求的新控制器没有任何影响。
我不知道您尝试使用此代码解决了什么问题,但您是否调查了setTimeout
和setInterval
javascript方法?它们提供客户端计时器服务,可能非常适合您的任务。
如果您需要持久的服务器端数据,那么有很多选项,包括:
哪些(如果有的话)适合您,取决于您尝试解决的实际问题。
答案 1 :(得分:2)
因为您的计时器将无法在页面生命周期中存活,假设这是ASP.NET。每次发生回发时,都会给出一个新的实例。
我不确定如何让计时器工作,但是为了在回调中保持持久性,你可以使用View State,Session或Cache之类的东西。
答案 2 :(得分:0)
每次发出请求时都不会对控制器进行实例化,因此每次发出请求时该值都为零?
如果需要全局计数器,请使用Application或静态字段。如果您希望它按每个用户使用会话计数。