异步让等待不阻塞线程

这里用定时器模拟 I/O:await 等结果,WhenAll 并发等待,CancellationToken 传递取消信号。

运行输出

await

等待 Task 完成后继续

WhenAll

三个分数并发完成

取消

超时触发 OperationCanceledException

异步流

await foreach 分批处理
异步不是让 I/O 更快,而是等待时不占着当前线程。

对应代码

static async Task<string> LoadProfileAsync(string name)
{
    await Task.Delay(10);
    return $"profile:{name}";
}

Task<int>[] tasks =
[
    FetchScoreAsync("math"),
    FetchScoreAsync("english"),
    FetchScoreAsync("code")
];
int[] scores = await Task.WhenAll(tasks);

using var cts = new CancellationTokenSource();
cts.CancelAfter(TimeSpan.FromMilliseconds(20));
await SlowOperationAsync(cts.Token);

await foreach (int value in CountAsync(3))
{
    Console.WriteLine(value);
}