如何启动并等待 Task 运行
Task.Run + Task.WhenAll
Task.Run 里边可以搭配 async,所有由 Task.Run 启动起来的 Task 所组成的数组允许被 WhenAll 等待,调用线程(如UI线程)不会阻塞
List<Task> taskArray = new List<Task>(3);
taskArray.Add(Task.Run(async() =>
{
for (var i = 0; i < 3; i++)
{
Console.WriteLine("tom saying" + i.ToString());
await Task.Delay(1500);
}
}));
taskArray.Add(Task.Run(async() =>
{
for (var i = 0; i < 3; i++)
{
Console.WriteLine("Ant saying" + i.ToString());
await Task.Delay(1500);
}
}));
taskArray.Add(Task.Run(async() =>
{
for (var i = 0; i < 3; i++)
{
Console.WriteLine("Tour saying" + i.ToString());
await Task.Delay(1500);
}
}));
Task done = Task.WhenAll(taskArray.ToArray());
await done.ContinueWith((t) => { Console.WriteLine($"{t.Status}"); });
Console.WriteLine("All work done");
如果 done 换做 Wait() 来等待的话,就会阻塞调用线程,如果是 UI 线程运行 Wait() 的话界面将冻结
Task done = Task.WhenAll(taskArray.ToArray());
done.Wait();
Console.WriteLine("All work done");
Task.Factory.StartNew + Task.WaitAll();
如果用 StartNew() 的方法创建并启动 Task,想要获得等待效果方法不能有 async 修饰
List<Task> taskArray = new List<Task>(3);
taskArray.Add(Task.Factory.StartNew(() =>
{
for (var i = 0; i < 30; i++)
{
Console.WriteLine("tom saying" + i.ToString());
Task.Delay(1500);
}
}));
taskArray.Add(Task.Factory.StartNew(() =>
{
for (var i = 0; i < 30; i++)
{
Console.WriteLine("Ant saying" + i.ToString());
Task.Delay(1500);
}
}));
taskArray.Add(Task.Factory.StartNew(() =>
{
for (var i = 0; i < 30; i++)
{
Console.WriteLine("Tour saying" + i.ToString());
Task.Delay(1500);
}
}));
Task.WaitAll(taskArray.ToArray());
Console.WriteLine("All work done");
注意 Task.Delay() 没有 await 的修饰,如果加入 await/async 的组合运行后 WaitAll() 将失效,这是为什么呢?不太懂。

浙公网安备 33010602011771号