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

标签 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
                });

            }
        }

最佳答案

在 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/

相关文章:

.net - xml文档中的非法字符

C#。如果 "after await"线程忙,会发生什么?

asp.net - 在 ASP.NET MVC 中验证时拒绝下拉占位符

c# - MVVM 方法,什么是好的方法?如何改进/加速开发?

c# - .NET core 3.1 中未找到 MenuItem 和 ContextMenuItem

java - Go、Java 和 C# 中数组的最大长度是多少?

.net - TeamCity 不从特定包源恢复 NuGet 包

asp.net-mvc - 还有什么比ASP.NET MVC中的隐藏表单域更安全的吗?

c# - 复制 Http 请求 InputStream

c# - 如何创建一个 C# 应用程序来决定是显示为控制台应用程序还是窗口应用程序?