Parallel.ForEach с количеством
От: _NN_ www.nemerleweb.com
Дата: 19.09.22 05:45
Оценка:
Имеется код вида:

List<Task> tasks;

foreach (var element in enumerable)
{
  tasks.Add(Task.Run( () => {} ) );
  Logger.Info($"Running task {element}");
}

Logger.Info($"Started {tasks.Count} tasks");
Task.WaitAll(tasks.ToArray());


Недостаток очевиден, мы создаём таск на каждый элемент, и лучше использовать Parallel.ForEach.
Однако с помощью Parallel.ForEach невозможно получить количество элементов.
В вышеприведённом примере мы их получаем неявно за счёт использования List.

Как вариант можно хранить переменную и автономно увеличивать:

int count = 0;

Parallel.ForEach(enumerable, element =>
{
  Interlocked.Increment(ref count);
  Logger.Info($"Running task {element}");
});

Logger.Info($"Run {count} tasks");


Тогда мы получаем лишний расход в виде Interlocked.Increment и выведем лог только после того как вся работа окончится в отличии от начального кода.

Как вы решаете эту задачу ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.