этот метод - doDayBegin (item.BranchId) занимает много времени для выполнения. поэтому я использую Parallel.ForEach для его параллельного выполнения. моя проблема теперь я хочу показать прогресс на веб-странице, чтобы пользователь узнал о прогрессе.
Я не эксперт в потоковом режиме. так что дайте мое предложение, что я могу сделать? как я могу это сделать. Я действительно не знаю.
public ActionResult Edit([DataSourceRequest] DataSourceRequest request)
{
try
{
JavaScriptSerializer js = new JavaScriptSerializer();
List<DB0010020Vm> _listDB0010020Vm = new List<DB0010020Vm>();
string dataDB0010020vm = Request.Form["griddetailsvm"];
if (!string.IsNullOrEmpty(dataDB0010020vm))
{
_listDB0010020Vm = js.Deserialize<List<DB0010020Vm>>(dataDB0010020vm).
Where(d => d.IsValid == "YES").ToList();
}
DateTime start = DateTime.UtcNow;
var context = System.Web.HttpContext.Current;
Parallel.ForEach(_listDB0010020Vm, item =>
{
doDayBegin(item.BranchId, context);
});
DateTime end = DateTime.UtcNow;
TimeSpan duration = end - start;
return Json(new
{
success = true,
message = "Day Begin Process Completed Successfully!" + duration
});
}
catch (Exception e)
{
return Json(new
{
success = false,
message = e.Message
});
}
}
После вызова функции doDayBegin вы можете добавить несколько строк, которые увеличивают счетчик поточно-безопасным способом. Счетчик, таким образом, будет представлять количество завершенных итераций. Чтобы обновить индикатор выполнения, добавление функции, которая устанавливает объект в новое значение, хорошо работает.
doProcessing(){
UInt16 count= 0;
Object countLock= new Object();
Parallel.ForEach(_listDB0010020Vm, item =>
{
doDayBegin(item.BranchId, context);
lock (countLock) { updateProgressBar(++count); }
});
}
updateProgressBar(UInt16 progress){
textBox1.Text = progress;
}
"count" будет перебираться с 0 до бесконечности вашего списка.
Там есть полезное сообщение в блоге о том, как добиться прогресса:
http://blog.stephencleary.com/2012/02/reporting-progress-from-async-tasks.html