首页 > 编程语言 >《C# in depth》第5章C#5.0中的更改(十三)——異步枚舉器

《C# in depth》第5章C#5.0中的更改(十三)——異步枚舉器

时间:2023-04-26 13:22:31浏览次数:32  
标签:5.0 异步 tasks enumerator C# 舉器 枚举 degreeOfParallelism

一、異步枚舉
异步枚举器(Async Enumerator)是指一种异步迭代器,可以用于处理异步数据源。它允许我们以异步的方式逐个读取数据源中的元素。

在传统的同步枚举器中,当我们遍历一个集合时,程序会等待每个元素返回后才能继续执行下一个操作。而在异步枚举器中,我们可以在等待当前元素返回时同时执行其他操作。

异步枚举器通常使用 async/await 关键字来实现异步操作。例如,在 C# 中,我们可以使用以下代码创建一个异步枚举器:

public async IAsyncEnumerator<int> GetAsyncEnumerator(CancellationToken cancellationToken = default)
{
    for (int i = 0; i < 10; i++)
    {
        await Task.Delay(1000, cancellationToken); // 模拟异步操作
        yield return i;
    }
}

通过上述代码,我们可以创建一个异步枚举器,其中每隔1秒钟返回一个整数。在使用这个异步枚举器时,我们可以使用 await foreach 语法进行遍历:

await foreach (var item in GetAsyncEnumerator())
{
    Console.WriteLine(item);
}

这将输出从0到9的整数,并且在每次等待延迟期间不会阻塞主线程,因为异步枚举器的枚举操作是异步执行的。

二、異步並行枚舉器
并行异步枚举器是一种用于处理大量数据集合的工具,它能够同时处理多个项并在必要时异步返回结果。下面是一个示例代码,用于演示如何创建并行异步枚举器:

public async Task<IEnumerable<T>> ParallelAsyncEnumerator<T>(
    IEnumerable<Task<T>> source, int degreeOfParallelism)
{
    var enumerator = source.GetEnumerator();
    var tasks = new List<Task<T>>(degreeOfParallelism);
    for (int i = 0; i < degreeOfParallelism; i++)
    {
        if (!enumerator.MoveNext())
        {
            break;
        }
        tasks.Add(enumerator.Current);
    }
    while (tasks.Count > 0)
    {
        var completedTask = await Task.WhenAny(tasks);
        tasks.Remove(completedTask);
        if (enumerator.MoveNext())
        {
            tasks.Add(enumerator.Current);
        }
        yield return completedTask.Result;
    }
}

这里的 ParallelAsyncEnumerator 方法接受两个参数:源集合 source 和并行度 degreeOfParallelism。该方法首先创建一个枚举器,然后使用 degreeOfParallelism 创建若干个任务,并从枚举器中获取前 degreeOfParallelism 个元素赋值给这些任务。接下来,在一个 while 循环中,该方法通过 Task.WhenAny 等待任意一个任务完成,并将已完成的任务从任务列表中移除。如果枚举器还有剩余元素,则获取下一个元素,并将其作为新任务添加到任务列表中。最后,通过 yield return 返回已完成任务的结果。

使用并行异步枚举器,可以同时处理多个任务,从而提高程序的效率。例如,在下载大量文件时,可以使用并行异步枚举器同时下载多个文件,从而加速整个过程。

标签:5.0,异步,tasks,enumerator,C#,舉器,枚举,degreeOfParallelism
From: https://www.cnblogs.com/DinAction/p/17355615.html

相关文章

  • mysql处理CVE-2023-21912漏洞
    目录背景解决办法系统现状思考升级过程(离线)1.查看Centos版本2.查看数据库版本3.数据库离线下载地址4.解压安装包5.停止mysql服务5.备份数据库文件6.卸载当前数据库版本7.本地安装8.启动mysql辅助操作查看含有mysql文件路径查找mysql配置文件查看文件占用大小当前目录查......
  • Python pandas 保存Excel自动调整列宽的方法及示例代码
    方法1.  用pd.ExcelWriter和  worksheet.set_column 需要安装xlsxwriter方法2:使用StyleFrame自动调整fromstyleframeimportStyleFrameimportpandasaspdcolumns=['aaaaaaaaaaa','bbbbbbbbb','ccccccccccc',]df=pd.DataFrame(data={......
  • rockyLinux 初体验(教程)PostgreSQL15
    目录数据库软件PostgreSQL安装数据库软件PostgreSQL配置数据库软件PostgreSQL交互通用数据库管理软件DBeaver彼时,PostgreSQL已经更新到了15.2。距离我上一次写PostgreSQL教程2022-03-20,已经过去一年多了。Linux篇PostgreSQL教程很久之前就想写了,一直停留在想法上......
  • vue-cli使用方法
    是什么?vue-clivuecommandlineinterface是vue命令行接口工具怎么用?1.安装npm:【Win7】只支持node.jsv13.14.0或更早1)到官网下载https://nodejs.org/download/release/v13.14.0/node-v13.14.0-x64.msi2)注意在安装node.js时,勾选“Automaticallyinstalltheneces......
  • COM6012 Brief
    COM6012Assignment-Deadline:AssignmentBriefPleasecarefullyreadtheassignmentbriefbeforestartingtocompletetheassignment.ReleaseStatus:Q1-14marks:Q2-12marks:updatedat12:00,24/03/2023Q3-12marks:releasedat18:30,29/03/2023......
  • 解决Python中报错RequestsDependencyWarning: urllib3 (1.26.9) or chardet (5.1.0)/c
      在运行requests包时,出现了以下报错信息:RequestsDependencyWarning:urllib3(1.26.9)orchardet(5.1.0)/charset_normalizer(2.0.12)doesn'tmatchasupportedversion!warnings.warn("urllib3({})orchardet({})/charset_normalizer({})doesn'tmatchasu......
  • 2022 蓝桥杯国赛 C++ B 组
    A\(\text{379187662194355221}\)。\(\text{dp}\)。C++Code#include"bits/stdc++.h"usingnamespacestd;usingi64=longlong;intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);vector<vector<i64>>f......
  • Qt+MySql开发笔记:Qt5.9.3的msvc2017x64版本编译MySql8.0.16版本驱动并Demo连接数据库
    前言  mysql驱动版本msvc2015x32版本调好,mysql的mingw32版本的驱动上一个版本编译并测试好,有些三方库最低支持vs2017,所以只能使用msvc2017x64,基于Qt5.9.3,于是本篇编译mysql驱动的msvc2017x64版本,满足当前的特定需求,这次过程有点费劲,可能是Qt的版本低于Qt5.12,继续无保留分享......
  • 胎教级培训手册:四步让ChatGPT成为小红书爆款大师
    文/高扬 最近公众号更新有些慢,因为我在配合陈楚做小红书。 ChatGPT用在小红书上具有天然优势,然后再接合AI绘画,更是绝配。 AI绘画,陈楚已经研究很久了,后续会不断地输出教程。 学太多ChatGPT技巧,大家好像并没有感觉到能带来什么好处,可是,假如ChatGPT能给自己带来切身利......
  • LeetCode 152. 乘积最大子数组
    20230426顺利通过原题解题目约束题解classSolution{public:intmaxProduct(vector<int>&nums){intmaxF=nums[0],minF=nums[0],ans=nums[0];for(inti=1;i<nums.size();++i){intmx=maxF,mn=minF;......