Это ожидаемое поведение.
у начать коллекциюTask
объекты в то же время и ждать, пока все не будет завершено. Следующий код показывает мое желаемое поведение.
public class Program
{
class TaskTest
{
private Task createPauseTask(int ms)
{
// works well
return Task.Run(async () =>
// subsitution: return new Task(async () =>
{
Console.WriteLine($"Start {ms} ms pause");
await Task.Delay(ms);
Console.WriteLine($"{ms} ms are elapsed");
});
}
public async Task Start()
{
var taskList= new List<Task>(new[]
{
createPauseTask(1000),
createPauseTask(2000)
});
// taskList.ForEach(x => x.Start());
await Task.WhenAll(taskList);
Console.WriteLine("------------");
}
}
public static void Main()
{
var t = new TaskTest();
Task.Run(() => t.Start());
Console.ReadKey();
}
}
Выход:
Start 1000 ms pause
Start 2000 ms pause
1000 ms are elapsed
2000 ms are elapsed
------------
Теперь мне интересно, можно ли подготовить мои задания и запустить их отдельно. Для этого я изменяю первую строку вcreatePauseTask(int ms)
метод изreturn Task.Run(async () =>
вreturn new Task(async () =>
и вStart()
метод, который я включилtaskList.ForEach(x => x.Start());
передWhenAll
, Но тогда происходят ужасные вещи.WhenAll
вызов завершается немедленно, и вывод:
Start 2000 ms pause
Start 1000 ms pause
------------
1000 ms are elapsed
2000 ms are elapsed
Может кто-нибудь показать мне, в чем моя ошибка и как ее исправить?