当前位置:首页 > C# > 正文

掌握 C# 异步流的取消支持(详解 IAsyncEnumerable 与 CancellationToken 的协同使用)

在现代 C# 开发中,异步流(Asynchronous Streams)已成为处理大量或实时数据流的强大工具。尤其在 .NET Core 3.0 及更高版本中引入的 IAsyncEnumerable<T> 接口,让开发者可以像使用同步集合一样优雅地遍历异步数据源。然而,在长时间运行的数据流操作中,如何安全、高效地取消这些操作,是每个开发者都必须掌握的关键技能。

掌握 C# 异步流的取消支持(详解 IAsyncEnumerable 与 CancellationToken 的协同使用) C#异步流  取消令牌 异步编程 第1张

什么是 C# 异步流?

简单来说,C# 异步流允许你以 await foreach 的方式逐个接收异步生成的数据项,而无需一次性加载全部数据。这在处理网络请求、数据库查询、传感器数据等场景中非常有用。

例如:

async IAsyncEnumerable<int> GenerateNumbersAsync(){    for (int i = 0; i < 10; i++)    {        await Task.Delay(500); // 模拟异步延迟        yield return i;    }}

为什么需要取消支持?

想象一下:用户正在浏览一个不断加载新消息的聊天界面,但突然点击了“返回”按钮。此时,后台仍在继续拉取新消息,不仅浪费资源,还可能引发异常。因此,我们需要一种机制,在用户取消操作时,立即停止异步流的执行。

这就是 取消令牌(CancellationToken)发挥作用的地方。它是 .NET 中用于协调取消操作的标准方式。

如何为异步流添加取消支持?

要让 IAsyncEnumerable<T> 支持取消,你需要在方法签名中加入 CancellationToken 参数,并在每次 yield return 前检查是否已请求取消。

以下是完整示例:

using System;using System.Collections.Generic;using System.Threading;using System.Threading.Tasks;class Program{    static async Task Main()    {        var cts = new CancellationTokenSource();        // 3秒后自动取消        cts.CancelAfter(TimeSpan.FromSeconds(3));        try        {            await foreach (var number in GenerateNumbersAsync(cts.Token))            {                Console.WriteLine($"Received: {number}");            }        }        catch (OperationCanceledException)        {            Console.WriteLine("异步流已被取消。");        }    }    static async IAsyncEnumerable<int> GenerateNumbersAsync(CancellationToken cancellationToken = default)    {        for (int i = 0; i < 100; i++)        {            // 检查是否请求取消            cancellationToken.ThrowIfCancellationRequested();            await Task.Delay(500, cancellationToken); // 将 token 传给异步方法            yield return i;        }    }}

关键点解析

  • 传递 CancellationToken:在调用 GenerateNumbersAsync 时传入 cts.Token
  • ThrowIfCancellationRequested():在每次循环开始前调用此方法,若已取消则抛出 OperationCanceledException
  • 将 Token 传给异步方法:如 Task.Delay(500, cancellationToken),确保底层异步操作也能响应取消。
  • 捕获异常:使用 try-catch 捕获 OperationCanceledException,实现优雅退出。

SEO 关键词回顾

本文深入讲解了 C#异步流 的取消机制,重点介绍了 IAsyncEnumerable 如何与 取消令牌(CancellationToken)配合使用,实现高效的 异步编程 模式。这些技术是构建高性能、响应式 .NET 应用的核心。

小结

通过合理使用 CancellationToken,你可以让你的 C# 异步流 更加健壮和用户友好。无论是在 Web API、桌面应用还是后台服务中,这种取消支持都能显著提升系统资源利用率和用户体验。

现在,你已经掌握了在 C# 中实现可取消异步流的完整方法。快去你的项目中试试吧!