如果我有可能需要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