如何在ASP.Net MVC3 C#4中延迟控制器动作结果

Mar*_*arc 1 c# asp.net-mvc asp.net-ajax c#-4.0 asp.net-mvc-3

我正在开发一个使用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;
}
Run Code Online (Sandbox Code Playgroud)

在视图中我使用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);
}
Run Code Online (Sandbox Code Playgroud)

使用此代码时,IIS7工作进程将完全挂起/冻结,因此只有杀死工作进程才能解锁整个IIS7服务器.所以Thread.Sleep()似乎不是一个好主意.至少不是我的应用程序环境.

有没有人用ASP.Net MVC做这样的事情还是有任何想法?

Thx,Marc

====更新:====

发现其中一个问题:虽然标准是错误的.它应该是这样的:

    while (noUdates && DateTime.Now < startTime.AddSeconds(10))
Run Code Online (Sandbox Code Playgroud)

现在的问题是在睡眠延迟循环运行时取消了其他AJAX请求.

关于SignalR:必须仔细看看,但问题是这需要额外的服务器端和客户端库,我必须获得批准,因此我希望能够实现"简单"的小型解决方案,减少影响,减少培训需求.但SignalR仍然是下一个版本之一的选项,可以取代民意调查 - 但需要首先获得一些培训和经验.

====更新2:====

我正在寻找一个没有额外的库/框架的解决方案,所以我可以将它应用到几乎完成的Web应用程序而不会产生巨大的影响.

Dar*_*rov 5

您可以查看SignalR,它专为此类情况而设计.客户端不会让多个HTTP请求轮询服务器,而是在更新可用时通知客户端的服务器.