所以我試圖添加一個異步進度欄上一個非常緩慢和長的查詢,插入一堆行到數據庫。我的實現是基於關閉這個例子:http://blog.janjonas.net/2012-01-02/asp_net-mvc_3-async-jquery-progress-indicator-long-running-tasks異步jQuery數據庫循環 - 幫助實施進度條
下面是進度條
function updateMonitor(taskId, status) {
$("#monitors").html("Task [" + taskId + "]: " + status);
}
//other code
if (doSend == true) {
$.post("/SendBatch/HandleBatchRequest", {
//other code
},
function (taskId) {
// Init monitors
//breakpoint here only stops it once the "/SendBatch/HandleBatchRequest" is done. PROBLEM.
$("#monitors").append($("<p id='" + taskId + "'/>"));
updateMonitor(taskId, "Started");
// Periodically update monitors
var intervalId = setInterval(function() {
$.post("SendBatch/Progress", { id: taskId }, function (progress) {
if (progress >= 100) {
updateMonitor(taskId, "Completed");
clearInterval(intervalId);
} else {
updateMonitor(taskId, progress + "%");
}
});
}, 100);
}
,"html");
的JavaScript代碼然後是網站
<div id="monitors"></div>
這裏的顯示部分中的DIV控制器外觀如何
public SendBatchController
//some code
private static IDictionary<Guid, int> tasks = new Dictionary<Guid, int>();
public ActionResult HandleBatchRequest(
//some code
)
{
var taskId = Guid.NewGuid();
tasks.Add(taskId, 0);
var batchId = Guid.NewGuid().ToString("N");
var costd = cost.ToDecimal();
IEnumerable<BatchListModel> customers;
try
{
customers = new CustomerService(_customerRepository.Session).GetCustomers(
//some code
);
}
catch (Exception err)
{
return Json(err.Message);
}
if (doSend)
{
var sent = 0;
foreach (var c in customers)
{
try
{
var usr = _customerRepository.LoadByID(c.ID);
var message = new ComLog
{
//insertions to log
};
_comLogRepository.Save(message);
sent++;
//progress bar part inside here that is important comes here:
tasks[taskId] = sent;
}
catch (Exception e)
{
Log.WriteLine("ERR:" + e);
}
tasks.Remove(taskId);
}
return Json(taskId);
}
return Json(customers.Count() + " customers");
}
public ActionResult Progress(Guid id)
{
return Json(tasks.Keys.Contains(id) ? tasks[id] : 100);
}
這樣做不行。該過程在後臺運行。查詢完成後,DIV會顯示「Complete」消息。它在查詢過程中不顯示。我不確定異步的東西如何工作,所以這裏可能會出現一些邏輯錯誤。例如,它甚至知道總共有多少客戶?代碼的另一個關鍵部分是「任務[taskId] =發送;」至於我不確定是否正確完成。