Имеется код вида:
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 и выведем лог только после того как вся работа окончится в отличии от начального кода.
Как вы решаете эту задачу ?