Как привести List к Task[]?
Как я могу привести список тасков к массиву? Решил изначально сделать списком, чтобы пользоваться методом Add(), но теперь не могу привести список к массиву
public void Purge(IEnumerable<string> clearList)
{
List<Task> tasks1 = new List<Task> { };
foreach (string i in clearList)
{
Task t = Task.Run(() => deleteAllIn(i));
tasks1.Add(t);
}
Task[] tasks = (Task[])(from i in tasks1 select i);// <--- пробовал так
Task.WaitAll(tasks);
}
Ответы (3 шт):
В качестве альтернативного варианта, имеет смысл не дожидаться списка тасков синхронно — это чревато deadlock-ом (да и блокировать поток для ожидания не стоит). Попробуйте асинхронное ожидание:
public Task PurgeAsync(IEnumerable<string> clearList) =>
Task.WhenAll(
clearList.Select(i =>
Task.Run(() =>
deleteAllIn(i))));
Не забудьте за-await-ить результат вызова там, где вы его вызываете.
Запускать неизвестное (или вы точно знаете что в коллекции никогда не будет много-много элементов?) количество задач не очень хорошо.
Если у Вас CPU-bound операция, тогда для распределения задачи по ядрам вам поможет Parallel.ForEach
public void Purge(IEnumerable<string> clearList)
{
Parallel.ForEach(clearList, i => deleteAllIn(i));
}
А если у Вас работа с одним физическим диском, нет никакого смысла её выполнять параллельно. Это даже может снизить производительность. Но очень даже есть смысл выполнять её асинхронно. Но, увы асинхронного удаления файлов нет в .Net. Поэтому просто цикл выполняющийся не в GUI-потоке это оптимальное решение.