C# WaitAll WaitAny WhenAll WhenAny傻傻分不清

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();
    }

}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值