C# 中 async/await 遇上 forEach 两种写法,是否按照遍历?

news/2024/5/19 21:08:10 标签: .netcore

在 C# 中,async/await 与 forEach 可以搭配使用,但需要注意的是,forEach 本身不是一个异步操作,它会按顺序同步地遍历集合中的元素,并将每个元素作为参数传递给回调函数。因此,如果在 forEach 循环中使用 async/await,它并不会等待每次循环的异步操作完成后再进行下一次循环。

示例代码如下:

using System;
using System.Collections.Generic;
using System.Threading.Tasks;

public class Program
{
    public static async Task Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

        // 使用 forEach 遍历集合
        numbers.ForEach(async number =>
        {
            // 模拟异步操作
            await Task.Delay(1000);
            Console.WriteLine(number);
        });

        Console.WriteLine("forEach 循环完成");

        // 使用 for 循环遍历集合
        foreach (int number in numbers)
        {
            // 模拟异步操作
            await Task.Delay(1000);
            Console.WriteLine(number);
        }

        Console.WriteLine("for 循环完成");
    }
}

运行以上代码,你会发现 forEach 循环会立即输出 “forEach 循环完成”,而后再一次性输出所有数字,因为 async/await 在 forEach 循环中并不起作用。

相反,使用 for 循环遍历集合时,async/await 可以异步等待每次循环的异步操作完成后再进行下一次循环,所以每个数字会逐个输出,输出间隔为 1 秒。

需要注意的是,对于 forEach 循环中的异步操作,你无法保证它们会以预期的顺序执行,因为它们是并行执行的。如果需要保持顺序执行,请使用 for 循环或其他适当的方法。


http://www.niftyadmin.cn/n/5292405.html

相关文章

Linux中的gcc\g++使用

文章目录 gcc\g的使用预处理编译汇编链接函数库gcc选项 gcc\g的使用 这里我们需要知道gcc和g实际上是对应的c语言和c编译器&#xff0c;而其他的Java&#xff08;半解释型&#xff09;&#xff0c;PHP&#xff0c;Python等语言实际上是解释型语言&#xff0c;因此我们经常能听…

当 ML 遇到 DevOps:如何理解 MLOps

近年来&#xff0c;人工智能 &#xff08;AI&#xff09; 和机器学习 &#xff08;ML&#xff09; 已经席卷全球&#xff0c;几乎成为任何行业的重要组成部分&#xff0c;从零售和娱乐到医疗保健和银行业。这些技术能够通过分析大量数据实现运营自动化、降低成本和促进决策&…

【CISSP学习笔记】5. 安全架构和工程

该知识领域涉及如下考点&#xff0c;具体内容分布于如下各个子章节&#xff1a; 使用安全设计原理来研究、实施与管理工程过程理解安全模型的基本概念&#xff08;例如 Biba、Star Model、Bell-LaPadula 等模型&#xff09;基于系统安全要求选择控制措施理解信息系统 (IS) 的安…

第十四章 Sentinel实现熔断与限流

Sentinel实现熔断与限流 gitee&#xff1a;springcloud_study: springcloud&#xff1a;服务集群、注册中心、配置中心&#xff08;热更新&#xff09;、服务网关&#xff08;校验、路由、负载均衡&#xff09;、分布式缓存、分布式搜索、消息队列&#xff08;异步通信&#x…

《网络安全面试总结》--大厂面试题目及经验

持续更新 整理 小鹏汽车-安全工程师 自我介绍有没有挖过src&#xff1f;平时web渗透怎么学的&#xff0c;有实战吗&#xff1f;有过成功发现漏洞的经历吗&#xff1f;做web渗透时接触过哪些工具xxe漏洞是什么&#xff1f;ssrf是什么&#xff1f;打ctf的时候负责什么方向的题…

thingsboard前端缓存--nginx

thingsboardnginx thingsboard部署到阿里云服务器之后&#xff0c;由于登录界面要发送的文件很大&#xff0c;并且服务器的带宽目前有限&#xff0c;因此配置一个nginx&#xff0c;进行前端页面的一些缓存&#xff0c;参考了https://qianchenzhumeng.github.io/posts/Nginx%E5…

Go 泛型之泛型约束

Go 泛型之泛型约束 文章目录 Go 泛型之泛型约束一、引入二、最宽松的约束&#xff1a;any三、支持比较操作的内置约束&#xff1a;comparable四、自定义约束五、类型集合&#xff08;type set&#xff09;六、简化版的约束形式七、约束的类型推断八、小结 一、引入 虽然泛型是…

SpringSecurity登录逻辑快速集成及原理探查

框架简介 Spring 是非常流行和成功的 Java 应用开发框架&#xff0c;Spring Security 正是 Spring 家族中的成员。Spring Security 基于 Spring 框架&#xff0c;提供了一套 Web 应用安全性的完整解决方案。 一般来说&#xff0c;Web应用的安全性包括用户认证&#xff08;Authe…