創建一個靜態類來管理這個長時間運行的操作。這個類將負責創建線程來執行任務,並提供一種方法來檢查任何正在進行的操作的狀態(即,如果它仍在進行中或已經完成,並且如果是的話,結果是什麼)。
您的MVC控制器方法然後使用這個類來完成工作並向用戶呈現狀態信息或完成的處理數據。
事情是這樣的:
public ActionResult GetSomething(String id) {
TaskResult result = TaskClass.GetStatus(id);
if(result == null) { // the task has not been run, so start it up
TaskClass.StartNew(id);
return new View("PleaseWait");
} else if(!result.IsFinished) {
return new View("PleaseWait");
} else {
return View("Results", result);
}
}
public static class TaskClass {
private static Dictionary<String,TaskResult> _tasks;
public static TaskResult GetStatus(String id) {
// TODO: Make this code thread-safe
if(_tasks.ContainsKey(id)) return _tasks[id];
return null;
}
public static void Start(String id) {
_tasks.Add(id, new TaskResult("Working"));
Thread thread = new Thread(SomeExpensiveOperation);
thread.Start(id);
}
}
在SomeExpensiveOperation年底會有代碼完成這標誌着TaskResult。
來源
2012-07-15 18:47:06
Dai
這可能是你最好的選擇:[在ASP.NET MVC中使用異步控制器](http://msdn.microsoft.com/en-us/library/ee728598.aspx) – 2012-07-15 18:56:06
但我認爲它只是優化了用法線程池,我的意思是我不能返回httpstatus代碼並繼續執行,檢查_Converting同步操作方法異步操作方法_部分 – 2012-07-15 19:04:25