如果我有可能需要10-20秒来运行,我想提供一个动作在MVC 4新的异步控制器功能
某种状态栏来通知用户进度。异步功能有什么可以帮助解决这个问题吗?
编辑:我将在我怎么会尝试做一个刺,看看有没有更好的办法
public async Task<ActionResult> GizmosAsync()
{
return View("Gizmos", await GetGizmosAsync());
}
private void GetGizmosAsync()
{
for(int i=0; i<10; i++)
{
lock(_locker)
{
_statusMessage = String.Format("{0} of 10", i);
}
DoSomethingLongRunning();
}
}
public ActionResult Status()
{
return Json(new { Status = _statusMessage });
}
static readonly object _locker = new object();
static string _statusMessage = "";
....
<script>
setTimeout(displayStatus, 1000);
function displayStatus() {
$.post("/controller/status", function(data) {
alert(data.Status);
});
}
</script>
是的,我已经做这样的事情,但如果它是相同的消息10秒的人认为该系统已挂起。 – Craig
嗯,我知道这听起来可能不合适,但有时候,进展的“幻觉”正是用户需要的。例如,如果您知道您的任务平均需要15秒,则使用js在该持续时间内自动化进度条。 我知道这可能看起来像是愚弄用户,但实际上有些情况下实际存储某处的部分进度,比如数据库,并且您的客户端轮询确切进度只是矫枉过正。 –
我没有想到SignalR,它可能会工作得很好。 – Craig