У меня было долгое обслуживание для этого, я дал базовую идею ниже. Используйте его в соответствии с вашими требованиями.
- Я сделал структуру аргументов прогресса
ProgressArgs
- В сервисном LongRunningProcess долго работает(), обновленные значения прогресса на регулярные промежутки времени и сохраненную в формате JSON в базе данных
- Создан метод действий
getProgress()
который вернет ход строки JSON с помощью ajax.
- Создана функция Javascript
getProgress()
Функция, которая когда-то запускается, будет вызывать сервер через регулярные промежутки времени для достижения прогресса, пока процесс не завершится.
Я привел пример для его реализации. Надеюсь, это может вам помочь.
Класс для аргументов прогресса структуры
public class ProgressArgs
{
public int Completed { get; set; }
public int Total { get; set; }
public int Percentage { get; set; }
public string Status { get; set; }
}
В процессе я продолжал обновлять статистику в базе данных
public void LongRunningProcess()
{
ProgressArgs result = new ProgressArgs();
result.Completed = 0;
result.Total = userList.Count;
foreach (var item in itemList)
{
//Do Some processing which u want to do
result.Total++;
result.Percentage = (result.Completed * 100)/result.Total;
result.Status = "Processing";
string strToSave = Newtonsoft.Json.JsonConvert.SerializeObject(result);
//update the strToSave to the database somewhere.
}
//after completing of processing
result.Total++;
result.Percentage = (result.Completed * 100)/result.Total;
result.Status = "Completed";
string strToSave = Newtonsoft.Json.JsonConvert.SerializeObject(result);
//update the strToSave to the database somewhere.
}
C# Действие получить прогресс на AJAX
public string getProgress()
{
string strJSON = config.GetValue("progress"); //Get stats from the database which is saved in json
return strJSON;
}
Javascript Code
//Ajax Get Progress function
function getProgress() {
var dataToSend = '';
$.ajax({
url: '@Url.Action("getProgress")', //Link to the action method
type: 'POST',
contentType: 'application/json; charset=utf-8',
data: dataToSend,
success: function (response) {
console.log(response);
if (response != null) {
data = JSON.parse(response);
console.log(data);
//update the progressbar
progressbar.progressbar("value", data.Percentage);
//When the jobalert status is completed clear the interval
if (data.Status == 0) {
setTimeout(getProgress, 800); //TImout function to call the respective function at that time
}
serviceCompleted(data); function to call after completing service
}
},
error: function (xhr) {
alert('Error: There was some error while posting question. Please try again later.');
}
});
}
Может быть, посмотрите на SignalR: http://msdn.microsoft.com/en-us/ Журнал/hh852586.aspx – Marthijn