Индикатор выполнения для длительного процесса в Parallel.ForEach

1

этот метод - 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
                });

            }
        }
  • 0
    Хотите отследить ход выполнения одного запуска doDayBegin или прохождение каждого элемента _listDB0010020Vm?
  • 0
    @ Мартон я хочу прогресс каждого элемента
Показать ещё 3 комментария
Теги:
multithreading
asp.net-mvc
parallel-processing

1 ответ

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

  • 0
    как передать это для просмотра постоянно.
  • 0
    Блокировка для увеличения целого числа приведет к ненужному конфликту, вот для чего нужны атомарные инструкции.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню