前言
在 .NET 9 中引入了一个新的方法:Task.WhenEach,用于简化异步编程。
这种方法允许你在任务完成时立即处理它们,而无需等待所有任务结束。
这在任务完成时间不一致、需要尽早对每个完成的任务采取行动的场景中特别有用。
第一步:创建一个名为 PrintWithDelay 的函数
async Task<int> PrintWithDelay(int delay)
{
await Task.Delay(delay);
return delay;
}
这段代码定义了一个名为 PrintWithDelay 的异步方法,它接收一个整数 delay 作为输入,并返回一个整数。
方法解析
1、async Task< int>
-
async:表示这是一个异步方法。异步方法可以在等待 I/O 操作或其他异步操作完成时将执行权让给其他任务。 -
Task<int>:表示方法的返回类型。方法会返回一个Task对象,当任务完成后,返回一个整数结果。
2、await Task.Delay(delay)
-
Task.Delay(delay):创建一个任务,该任务会在指定的delay毫秒后完成。 -
await:暂停当前方法的执行,直到Task.Delay任务完成。在等待期间,线程可以用于执行其他任务。
3、return delay
- 当延迟完成后,方法恢复执行,并返回原始的
delay值。
第二步:创建一个任务列表,每个任务会调用 PrintWithDelay 方法并传入不同的延迟值
List<Task<int>> printTasks = new List<Task<int>>()
{
PrintWithDelay(4000),
PrintWithDelay(6000),
PrintWithDelay(2000)
};
代码解析
这里声明了一个名为 printTasks 的列表,用于存储任务。
列表中包含三个调用 PrintWithDelay 方法的任务,每个调用使用了不同的延迟值(4000 毫秒、6000 毫秒、2000 毫秒)。
每次调用都会返回一个 Task<int>对象,表示一个异步操作,最终会返回一个整数结果。
这些任务被添加到 printTasks 列表中。
第三步:在.NET 9中使用 Task.WhenEach
Task.WhenEach 返回一个 IAsyncEnumerable,允许异步处理任务,按完成顺序逐一处理。
await foreach (var task in Task.WhenEach(printTasks))
{
Console.WriteLine(await task);
}
代码解析
1、Task.WhenEach(printTasks)
-
接收一个
Task<int>对象的集合(即printTasks)。 -
返回一个
IAsyncEnumerable<Task<int>>。该集合表示将随着时间推移而完成的一系列任务。
2、await foreach (var task in Task.WhenEach(printTasks))
-
这是一个异步
foreach循环,用于遍历Task.WhenEach返回的IAsyncEnumerable。 -
await表示循环会暂停执行,直到下一个任务完成。
简要工作流程
1、调度任务:printTasks 中的任务被异步调度执行。
2、处理已完成的任务:当某个任务完成时,它会从 Task.WhenEach 的枚举中依次被返回。
3、记录任务完成情况:异步 foreach 循环迭代这些已完成的任务,并使用 Console.WriteLine 打印每个任务的结果。
示例输出
假设延迟分别为 4000 毫秒、6000 毫秒和 2000 毫秒,程序可能输出以下内容(任务按完成顺序处理):
2000
4000
6000
总结
通过使用 Task.WhenEach,你可以编写更高效且响应性更强的异步代码。这种方法特别适合处理任务完成时间不一致的场景。
译文地址:c-sharpcorner.com/article/net-9-task-wheneach
最后
如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。
也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!
优秀是一种习惯,欢迎大家留言学习!
作者:DotNet开发跳槽
出处:mp.weixin.qq.com/s/gBDyU8ZMdhpbaV6f6mpN-g
声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!