我希望同时启动一个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()
方法中,我在WhenAll
之前包含了taskList.ForEach(x => x.Start());
。但是,可怕的事情发生了。调用WhenAll
会立即完成,并且输出如下:Start 2000 ms pause
Start 1000 ms pause
------------
1000 ms are elapsed
2000 ms are elapsed
有人能帮我看看我的错误并告诉我如何修复吗?
Task.WhenAll()
确实在任务完成之前返回。 - sellotape