我正在使用 MVC3、Razor、C# 4、jQuery 开发 Web 应用程序。
在一个屏幕(页面)内,我对控制器操作进行 AJAX 调用以获取一些屏幕更新。使用 Javascripts setTimeout() 我进行轮询。
为了在服务器没有屏幕更新的情况下优化此轮询,我喜欢延迟 HTTP 响应并稍等片刻,直到我 a) 获得屏幕更新或 b) 遇到一些超时(例如 10 秒左右)。
我试图做这样的事情
[OutputCache(Duration = 0)]
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult CheckForUpdates()
{
var startTime = DateTime.Now;
while (_haveUpdates || DateTime.Now > startTime.AddSeconds(10 ))
{
Thread.Sleep(3);
}
return _haveUpdate ? Json(new {updates = ... }, JsonRequestBehavior.AllowGet) : null;
}
在视图中,我像这样使用 Javascript / jQuery:
<script>
$(function () {
scheduleNextCheck();
});
function scheduleNextCheck() {
setTimeout(function() {
$.ajax({
url: "@Url.Action("CheckForUpdates")",
dataType: 'json',
data: null,
timeout: 10000,
cache: false,
success: function(data) {
if (data != null && data.updates != null ) {
// Apply Updates
} else {
scheduleNextCheck();
}
},
error: function() {
scheduleNextCheck();
}
});
}, 2000);
}
使用此代码时,IIS7 工作进程将完全挂起/冻结,因此只有杀死工作进程才能解锁整个 IIS7 服务器。所以 Thread.Sleep() 似乎不是一个好主意。至少不是我的应用程序环境。
有人用 ASP.Net MVC 做过这样的事情吗?或者有任何想法吗?
谢谢,马克
==== 更新:====
发现问题之一:while 条件错误。它应该是这样的:
while (noUdates && DateTime.Now < startTime.AddSeconds(10))
现在的问题是其他 AJAX 请求在此睡眠延迟循环运行时被取消。
关于 SignalR:必须仔细研究,但问题是这需要额外的服务器和客户端库,我必须获得批准,所以我希望有一个“简单”的小型解决方案,影响更小,培训需求更少. 但是 SignalR 仍然是下一个版本中替代轮询东西的一个选项 - 但需要首先获得一些关于这些东西的培训和经验。
==== 更新 2:====
我正在寻找一种无需额外库/框架即可工作的解决方案,因此我可以将其应用于几乎完成的 Web 应用程序而不会产生巨大影响。