C#学习:异步模式_Task.WhenAny和Task.WhenAll
2022/6/29 14:21:40
本文主要是介绍C#学习:异步模式_Task.WhenAny和Task.WhenAll,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
C#的CLR(即 common language runtime,公共语言运行库)包含两种任务组合器:Task.WhenAny
和Task.WhenAll
。
我们先定义如下方法:
async Task<int> Delay1() { await Task.Delay(1000); return 1; } async Task<int> Delay2() { await Task.Delay(2000); return 2; } async Task<int> Delay3() { await Task.Delay(3000); return 3; }
Task.WhenAny
Task.WhenAny
方法会在任务组中的任意一个任务完成时返回这个任务。
如下任务会在一秒钟完成:
Task<int> winningTask = await Task.WhenAny(Delay1(), Delay2(), Delay3()); Console.WriteLine("Done"); Console.WriteLine(winningTask.Result);
我们等待的Task.WhenAny
返回的任务将会是所有任务中第一个完成的任务。
上述示例是非阻塞的,但即便如此,也建议对winningTask进行await等待操作,因为这样做的话,如果有一个并非第一个结束的任务发生了失败,我们没有等待,那这个异常将会成为未观测的异常。
Task.WhenAll
Task.WhenAll
返回一个任务,该任务仅当参数中所有任务全部完成时才完成。
如下任务会在三秒钟完成:
await Task.WhenAll(Delay1(), Delay2(), Delay3());
若不用WhenAll依次等待,则可以得到相似结果:
Task task1 = Delay1(), task2 = Delay2(), task3 = Delay3(); await task1; await task2; await task3;
三次等待的效率一般来说低于一次等待。还有,如果task1出错,那么就无法等待task2和task3,导致如果他们中间发生异常成为未观测异常。
如果多个任务发生了错误,那么这些异常会组合到任务的AggregateException
中。但是如果等待该组合任务的话,则只会抛出第一个异常。
如果查看所有异常,应用以下写法:
Task task1 = Task.Run(() => { throw null; }); Task task2 = Task.Run(() => { throw null; }); Task all = Task.WhenAll(task1, task2); try { await all; } catch { Console.WriteLine(all.Exception.InnerExceptions.Count); // 2 }
对一系列Task<TResult>
任务调用WhenAll会返回一个Task<TResult[]>
,即所有任务的结果组合。
如下示例:
Task<int> task1 = Task.Run(() => 1); Task<int> task2 = Task.Run(() => 2); int[] results = await Task.WhenAll(task1, task2); // { 1, 2 }
这篇关于C#学习:异步模式_Task.WhenAny和Task.WhenAll的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-12-06使用Microsoft.Extensions.AI在.NET中生成嵌入向量
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#