找回密码
 立即注册
快捷导航

[C#] .NET 9新特性:Task.WhenEach

[复制链接]
admin 2024-12-14 16:25:36 | 显示全部楼层

在 .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 毫秒,程序可能输出以下内容(任务按完成顺序处理):

.NET 9新特性:Task.WhenEach7423 作者:admin 帖子ID:1178

2000  
4000  
6000  

总结

通过使用 Task.WhenEach,你可以编写更高效且响应性更强的异步代码。这种方法特别适合处理任务完成时间不一致的场景。

祝Code愉快!

译文地址:c-sharpcorner.com/article/net-9-task-wheneach

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

温馨提示

关于 注册码 问题

      由于近期经常大量注册机器人注册发送大量广告,本站开启免费入群领取注册码注册网站账号,注册码在群公告上贴着...

关于 注册码 问题

      由于近期经常大量注册机器人注册发送大量广告,本站开启免费入群领取注册码注册网站账号,注册码在群公告上贴着...

Archiver|手机版|小黑屋|DLSite

GMT+8, 2025-1-18 13:00

Powered by Discuz! X3.5 and PHP8

快速回复 返回顶部 返回列表