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

简单来说,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; } }}
GenerateNumbersAsync 时传入 cts.Token。OperationCanceledException。Task.Delay(500, cancellationToken),确保底层异步操作也能响应取消。try-catch 捕获 OperationCanceledException,实现优雅退出。本文深入讲解了 C#异步流 的取消机制,重点介绍了 IAsyncEnumerable 如何与 取消令牌(CancellationToken)配合使用,实现高效的 异步编程 模式。这些技术是构建高性能、响应式 .NET 应用的核心。
通过合理使用 CancellationToken,你可以让你的 C# 异步流 更加健壮和用户友好。无论是在 Web API、桌面应用还是后台服务中,这种取消支持都能显著提升系统资源利用率和用户体验。
现在,你已经掌握了在 C# 中实现可取消异步流的完整方法。快去你的项目中试试吧!
本文由主机测评网于2025-12-22发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20251211620.html