此方法 - 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
关于c# - Parallel.ForEach 中长时间运行进程的进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26732639/