新闻中心

C# 异步流(async streams)的用法 - await foreach循环

2025-12-09
浏览次数:
返回列表
C# 8.0+ 引入异步流(IAsyncEnumerable)和 await foreach,支持非阻塞式异步枚举;可配合 CancellationToken 实现取消,需 C# 8.0+ 和兼容 SDK(如 net6.0)。

c# 异步流(async streams)的用法 - await foreach循环

在 C# 8.0 及更高版本中,引入了异步流(async streams)的概念,允许你以异步方式枚举数据流。这特别适用于处理大量数据、I/O 操作或从网络、文件、数据库等逐步获取数据的场景。核心特性之一是 await foreach 循环,它可以消费实现了 IAsyncEnumerable<t></t> 的异步数据源。

什么是 IAsyncEnumerable

IAsyncEnumerable<t></t> 是一个接口,表示一个可以异步枚举的序列。与传统的 IEnumerable<t></t> 不同,它不会阻塞调用线程,适合用于耗时的数据读取操作。

要创建一个异步流,方法需返回 IAsyncEnumerable<t></t> 并使用 yield return 配合 async IAsyncEnumerable 语法。

示例:定义一个异步流方法

以下是一个模拟逐条返回字符串的异步流:

async IAsyncEnumerable<string> GetDataAsync()<br/>
{<br/>
    for (int i = 1; i <= 5; i++)<br/>
    {<br/>
        await Task.Delay(1000); // 模拟异步延迟<br/>
        yield return $"Item {i}";<br/>
    }<br/>
}

使用 await foreach 消费异步流

要消费上面生成的数据流,使用 await foreach 语法。它会等待每一项可用后再处理,不会阻塞主线程。

示例:使用 await foreach 遍历异步流

await foreach (var item in GetDataAsync())<br/>
{<br/>
    Console.WriteLine(item);<br/>
}

这段代码每秒输出一条信息,总共五条。整个过程是非阻塞的,适合用于 UI 应用或 Web API 中避免线程挂起。

GemDesign GemDesign

AI高保真原型设计工具

GemDesign 652 查看详情 GemDesign

控制异步流的取消

异步流支持取消操作。你可以通过传入 CancellationToken 来中断正在运行的流。

修改方法签名以接收 token:

async IAsyncEnumerable<string> GetDataAsync([EnumeratorCancellation] CancellationToken ct = default)<br/>
{<br/>
    for (int i = 1; i <= 5; i++)<br/>
    {<br/>
        await Task.Delay(1000, ct); // 支持取消的延迟<br/>
        yield return $"Item {i}";<br/>
    }<br/>
}

调用时传入 token:

using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(3));<br/>
await foreach (var item in GetDataAsync(cts.Token))<br/>
{<br/>
    Console.WriteLine(item);<br/>
}

三秒后循环将被取消,防止继续执行。

注意事项和使用建议

  • 确保项目 SDK 支持 C# 8.0 或更高版本(如 netstandard2.1net6.0
  • await foreach 只能在 async 方法中使用
  • 若不需要异步生成数据,仍应使用普通 foreachIEnumerable<t></t>
  • 在 ASP.NET Core 等环境中,异步流可用于 Streaming API 响应,提升性能和响应性

基本上就这些。await foreach 让你能够自然地处理异步数据流,写法简洁,逻辑清晰,是现代 C# 异步编程的重要补充。不复杂但容易忽略细节,比如取消支持和编译器要求。

以上就是C# 异步流(async streams)的用法 - await foreach循环的详细内容,更多请关注其它相关文章!


# 这段  # seo时间规划表  # 河津网站优化  # 分类网站建设方案模板  # 营销推广的主要工具  # 如何提升seo浏览内容  # 锦州建设网站超值套餐  # 无锡模板网站建设产品  # 沈阳网站建设开发电话  # 如何做订阅的网站推广  # 优化排名靠前的网站  # 中文网  # 相关文章  # c# 异步流  # 适用于  # 遍历  # 一是  # 你可以  # 让你  # 如何处理  # 是一个  # .net  # c#  # stream  # ai 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 为什么简单的XML文件也会解析失败? 检查隐藏的非打印字符(如BOM)的方法  护手霜蹭到袖口上了如何清洗? 怎样避免留下一圈油印?  2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC  如何在CSS中使用visited与link控制链接颜色_visited link伪类配合  漫蛙2网页版漫画入口 漫蛙漫画在线官方登录  品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程  怎样更改Windows系统的默认安装路径_避免C盘爆满的终极设置【技巧】  Angular响应式表单:实现提交后表单及按钮的禁用与只读化  windows10怎么查看硬盘序列号_windows10硬盘id查询命令  韩剧圈正版入口页面_韩剧圈官网登录链接  Archive of Our Own官网直达 AO3最新可用地址一览  Golang如何使用new_Go new分配内存机制讲解  极速漫画官方主页网址 极速漫画漫画在线浏览官网链接  Django表单提交验证失败后保持字段值不刷新  J*aScript类型检查_j*ascript代码规范  J*a应用集成GitHub CLI与API认证指南  excel如何生成目录 excel一键生成工作表目录超链接  邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧  如何使用spryker/configurable-bundles-products-resource-relationship模块解决复杂产品捆绑关系难题  谷歌学术网站直达地址 谷歌学术搜索网页版一键进入  在J*a中如何开发简易仓库管理与库存统计_仓库管理库存统计项目实战解析  如何在 Windows 11 中启动游戏手柄设置  Win11怎么开启卓越性能模式 Win11电源选项启用高性能释放硬件潜力【方法】  如何在J*a中实现统一对象行为接口_项目大型化时的接口规范化  AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看  蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接  C++如何检测键盘输入_C++ _kbhit与_getch函数非阻塞输入  win11怎么查看应用耗电情况 Win11电池设置查看应用能耗排行榜【优化】  绝地鸭卫平a核爆刀流玩法攻略  Mac怎么锁定备忘录_Mac备忘录加密设置教程  C#使用XPath查询节点时出错? 常见语法错误与调试技巧  Python中高效访问嵌套字典与列表中的键值对  c++ 命名空间怎么用 c++ namespace使用指南  在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析  uc手机浏览器网页版入口 uc浏览器手机版便捷登录首页  PHP中获取MongoDB服务器运行时间(Uptime)的专业指南  Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求  Golang如何使用context实现超时取消_Golang context超时取消模式实践  LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置  c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换  J*a中实现Go语言select通道多路复用机制  照顾宝贝2小游戏免费秒玩入口  中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】  如何在网页中实现特定地点的随机图片展示  痛风发作了怎么办? 快速止痛和后期饮食调理  word中如何让数字纵向排列_Word数字纵向排列方法  京东单号查询入口_京东快递订单追踪入口  React中useState与局部变量:理解组件状态管理与渲染机制  Win11怎么开启高性能模式_Windows 11电源计划优化设置  Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践 

搜索