Метод Task.Factory.StartNew
устарел и почти никогда не использовался в наши дни, также он не понимает асинхронные делегаты .
Другое дело, что делегат Action
возвращает void, а async void
- это действие типа «забыл и забыл». Эта операция не возвращает Задачу и не ожидается.
Изменить Action
:
tasks[i] = Task.Factory.StartNew(new Action(async () =>
{
await Task.Delay(1000);
Console.WriteLine("Task1 completed: " + sw.Elapsed);
}));
К Func<Task>
и Task.Run
:
tasks[i] = Task.Run(new Func<Task>(async () =>
{
await Task.Delay(1000);
Console.WriteLine("Task1 completed: " + sw.Elapsed);
}));
Поскольку тип делегата определяется компилятором, мы можем сократить его до:
tasks[i] = Task.Run(async () => ...
Теперь он работает как положено и ожидает завершения всех задач