Parallel.ForEach中长时间运行进程的进度条

时间:2014-11-04 10:16:21

标签: c# .net asp.net-mvc multithreading parallel-processing

此方法 - 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
                });

            }
        }

1 个答案:

答案 0 :(得分:5)

在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