C# WaitAll WaitAny WhenAll WhenAny傻傻分不清
WaitAll WaitAny WhenAll WhenAny都是Task的静态方法
WaitAll:
阻塞式,当前线程会等待所有任务结束,然后才能执行后续语句
WaitAny,
阻塞式,当前线程会等待任意任务结束,然后才能执行后续语句
WhenAll:
非阻塞式,当前线程会返回一个新的任务,在该任务中等待所有任务结束,因此当前线程不会阻塞
WhenAny:
非阻塞式,当前线程会返回一个新的任务,在该任务中等待任意任务结束,因此当前线程不会阻塞
以下是测试代码
using System;
using System.Threading;
using System.Collections;
using System.Threading.Tasks;
using System.Collections.Generic;
class CancelTask
{
public static async Task Main()
{
Task task1 = Task.Run(async () => {
Console.WriteLine("任务1开始");
await Task.Delay(1000);
Console.WriteLine("任务1结束");
});
Task task2 = Task.Run(async () => {
Console.WriteLine("任务2开始");
await Task.Delay(2000);
Console.WriteLine("任务2结束");
});
Task task3 = Task.Run(async () => {
Console.WriteLine("任务3开始");
await Task.Delay(3000);
Console.WriteLine("任务3结束");
});
var tasks = new Task[]{
task1, task2, task3
};
Dictionary<Task, Action> dictionary = new()
{
{ task1, () => { Console.WriteLine("task1执行完成之后,对应的Action执行了"); } },
{ task2, () => { Console.WriteLine("task2执行完成之后,对应的Action执行了"); } },
{ task3, () => { Console.WriteLine("task3执行完成之后,对应的Action执行了"); } },
};
//WaitAll测试
//Task.WaitAll(tasks); //WaitAll阻塞式等待所有任务执行完
//Console.WriteLine("所有任务执行完毕");
//WaitAny测试
//int index = Task.WaitAny(tasks);//WaitAny阻塞式等待任意任务执行完,返回值是这个执行完的任务的index,一旦有任务执行完了,就不阻塞了,
//dictionary[tasks[index]]();
//Console.WriteLine("某个任务执行完毕");
//WhenAny测试
Task completedTask = await Task.WhenAny(tasks);//WhenAny返回一个新的任务,在这个任务中等待任意任务执行完,如果加上await,那么赋值号左侧接收到的就是这个最先执行完的任务
dictionary[completedTask]();
Console.WriteLine("某个任务执行完毕");
//WhenAll测试
//await Task.WhenAll(tasks); //WhenAll返回一个新的任务,在这个任务中等待所有任务执行完
//Console.WriteLine("所有任务执行完毕");
Console.ReadLine();
}
}