【C#】并行编程实战:异步流

news2024/12/22 23:58:57

        本来这章该讲的是 ASP .NET Core 中的 IIS 和 Kestrel ,但是我看了下这个是给服务器用的。而我只是个 Unity 客户端程序,对于服务器的了解趋近于零。

        鉴于我对服务器知识和需求的匮乏,这里就不讲原书(大部分)内容了。本章节里面有一部分还是客户端也可以学习的,就是异步流。所以这个章节就改为只学习异步流即可。

        本教程学习工程:魔术师Dix / HandsOnParallelProgramming · GitCode


1、异步流简介

        .Net Core 3.0 还引入了异步流(Asynchronous Stream)支持。

异步返回类型 | Microsoft Learn了解在 C# 中异步方法可以具有的返回类型,以及每种类型的代码示例。icon-default.png?t=N6B9https://learn.microsoft.com/zh-cn/dotnet/csharp/asynchronous-programming/async-return-types

        这项新功能可以使开发人员等待 IAsyncEnumerable<T> 上的 foreach 循环以使用流中的元素,并使用 yield 返回流以生成元素。异步流不但支持海量数据,而且可使服务器在同一时间通过有效地利用线程来做出响应。

2、语法介绍

        按照本章节的说法,我们这里使用两个接口:IAsyncEnumerable<T> 和 IAsyncEnumerator<T>。对于接口的实现比较好说,直接看代码:

    public class MyAsyncEnumerable : IAsyncEnumerable<int>
    {

        private MyAsyncEnumerator mAsyncEnumerator;

        public IAsyncEnumerator<int> GetAsyncEnumerator(CancellationToken cancellationToken = default)
        {
            if (mAsyncEnumerator == null)
                mAsyncEnumerator = new MyAsyncEnumerator();
            return mAsyncEnumerator;
        }
    }
    
    public class MyAsyncEnumerator : IAsyncEnumerator<int>
    {
        private int m_Value;

        public async ValueTask<bool> MoveNextAsync()
        {
            m_Value++;
            await Task.Delay(1000);
            if (m_Value < 10)
                return true;
            else
                return false;
        }

        public int Current => m_Value;

        public ValueTask DisposeAsync()
        {
            m_Value = 0;
            return new ValueTask(Task.CompletedTask);
        }
    }

        这里我们看到,每次执行 MoveNext 的时候,就会等待 1s (这里是模拟某个非常耗时的函数),之后再继续执行直到返回 false,这里当然是和普通迭代器模式是一样的。

3、测试用例

        下面我们来测试一下,直接在主线程调用运行以下函数:

        public static async void TestRunWithAsyncStream()
        {
            Debug.Log("TestRunWithAsyncStream Start !");
            MyAsyncEnumerable myEnumerable = new MyAsyncEnumerable();
            await foreach (var item in myEnumerable)
            {
                Debug.Log($"{Task.CurrentId} => {item}");                
            }
            Debug.Log("TestRunWithAsyncStream End !");
        }

        运行结果如下:

         可见运行过程中并没有阻塞主线程,而是在异步执行了MoveNext,将值返回到当前循环体中。由于方法体是在主线程执行的,所以还可以这么写:

        public static async void TestRunWithAsyncStream()
        {
            Debug.Log("TestRunWithAsyncStream Start !");
            MyAsyncEnumerable myEnumerable = new MyAsyncEnumerable();
            await foreach (var item in myEnumerable)
            {
                Debug.Log($"{Task.CurrentId} => {item}");
                //创建一个Obj
                var go= GameObject.CreatePrimitive(PrimitiveType.Cube);
                go.name = $"OBJ_{item}";
            }
            Debug.Log("TestRunWithAsyncStream End !");
        }

        从运行结果上看:

         异步创建了 GameObject,这里就很方便地看到异步和主线程结合在一起了,在使用上并看不到任何差异。


4、总结

        异步流用起来很简单,写起来稍微复杂一些。

        在数据量不多的时候,我们通常是将所有的异步操作(例如读文件)完成,之后再在主线程执行一些 Unity 的操作。当然在一般情况下是没问题的,一般来讲数据都不大,不存在问题。但是如果是所谓的海量数据,读文件占用的时间就足够大,而主线程等待时间过长又没有反应,就不是很友好。这种情况下就可以使用异步流来处理:执行一段异步程序处理、马上就执行主线程处理。

        而且使用异步流能保证执行顺序(相应地并行度就只为1),比较适合某些流程性质的重逻辑。

        本教程学习工程:魔术师Dix / HandsOnParallelProgramming · GitCode

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/790977.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于RPA的自动化流程治理方案探索及应用实践

编者荐语&#xff1a; 随着企业数字化转型进程加快&#xff0c;信息系统大量上线&#xff0c;但流程运营管理问题逐渐显现出来。为提升企业流程运营能力&#xff0c;亚信科技联合某省运营商推出智能化流程治理运营模式&#xff0c;尝试基于RPA&#xff08;机器人流程自动化&am…

IRIS搭建docker

之前把web实现了docker&#xff0c;开发或测试环境可能需要开发自己搭数据库&#xff0c;为了方便使用&#xff0c;把数据库也做一个docker。 由于原生的CentOS我还有改yum仓库&#xff0c;所以这次从之前lis搞的改好yum的镜像开始&#xff08;从改好yum的lisnew的镜像创建lis…

SaaS到底是什么,如何做?这份笔记讲明白了

阅读本篇文章&#xff0c;您将可以了解&#xff1a;1、什么是SaaS&#xff1b;2、SaaS的商业模式&#xff1b;3、SaaS的技术架构&#xff1b;4、国内比较好的SaaS平台。 一、什么是SaaS SaaS即软件即服务&#xff08;Software as a Service&#xff09;&#xff0c;是一种通过…

【数据结构】AVL树/红黑树

目录 1.AVL树&#xff08;高度平衡二叉搜索树&#xff09; 10.1.基本概念 10.2.实现 10.2.1.AVL树节点的定义 10.2.2.AVL树的插入 10.2.3.AVL树的旋转 1.新节点插入较高左子树的左侧---左左&#xff1a;右单旋 2.新节点插入较高右子树的右侧---右右&#xff1a;左单旋 3.新节点…

Python Flask构建微信小程序订餐系统 (十二)

🔥 创建切换商品分类状态的JS文件 🔥 ; var food_act_ops={init:function(){this.eventBind();},eventBind:function(){//表示作用域var that = this;$(".wrap_search select[name=status]").change(function(){$(".wrap_search").submit();});$(&qu…

对ai绘画二次元生成器你有多少了解?

在一个小镇上&#xff0c;有一位年轻的艺术家名叫艾米莉。她是个富有创意的女孩&#xff0c;总是追求着新奇和美妙的艺术体验。然而&#xff0c;她最近遇到了一些创作上的障碍&#xff0c;感觉自己的绘画已经陷入了瓶颈。在艾米莉寻找灵感的过程中&#xff0c;她听说了神秘的ai…

SQL语句(三十二)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、SQL语句类型 二、数据库操作 ​三、数据表操作 1. 数据类型 2. 查看 3. 创建 4. 删除 5. 更改 5.1 表 5.2 列 四、数据操作 4.1 增 4.2 删 4.3 改 4.4 查…

13.5.4 【Linux】常用模块简介

登陆所需要的PAM流程&#xff1a; 上面这个表格当中使用到非常多的 PAM 模块&#xff0c;每个模块的功能都不太相同&#xff0c;详细的模块情报可以在你的系统中找到&#xff1a; /etc/pam.d/*&#xff1a;每个程序个别的 PAM 配置文件&#xff1b; /lib64/security/*&#x…

网络:HCIA 1

1. 通信系统的组成&#xff1a; 终端设备&#xff1a;电脑 中间设备&#xff1a;交换机、路由器、防火墙。 传输介质&#xff1a;网线&#xff08;双绞线&#xff09;传输距离一般为100米&#xff0c;传输的是电信号。 光纤传输的是光信号。 光纤接口类型&#xff0c;方形接口…

前端(九)——探索微信小程序、Vue、React和Uniapp生命周期

&#x1f642;博主&#xff1a;小猫娃来啦 &#x1f642;文章核心&#xff1a;探索微信小程序、Vue、React和Uniapp生命周期 文章目录 微信小程序、Vue、React和Uniapp的基本定义和应用领域微信小程序生命周期生命周期概述页面生命周期应用生命周期组件和API的生命周期钩子 Vu…

看完这篇,别再说不会Spring 分库分表了

多数据源&#xff0c;读写分离&#xff0c;分库分表&#xff0c;基本上已经是现在任何一个项目的基本配置了&#xff0c;在之前的文章Spring多数据源实现https://blog.csdn.net/wangerrong/article/details/131910740 里讲了多数据源的实现&#xff0c;其实已经包含了读写分离…

广东省《5A物理抗菌纺织品》团体标准颁布

近日&#xff0c;经广东省标准化协会批准发布由广东人仁康科技有限公司主导制定的《5A物理抗菌纺织品》&#xff08;T/GDBX 073—2023&#xff09;团体标准&#xff0c;于2023年7月21日发布并实施。 根据标准制修订工作流程&#xff0c;该项标准2022年由人仁康和广检集团组织起…

【【51单片机AD/DA的分析】】

51单片机AD/DA的分析 看似单片机实验&#xff0c;其实是要学好数电 模数转换 与 数模转换 运算放大器 DA的转换就是利用运算放大器实现的 输出电压v0-(D7~D0)/256 x (VrefxRfb)/R D7~D0 就是我们控制的按键看输入多少 然后再划分256份 Vref是我们设置的一个基准电压 PWM 这种…

若依分离版——解决配置双数据源oracle,mysql分页错误问题

1. 按照若依的手册配置双数据源mysql&#xff0c;oracle 2. 在service指定 数据源 DataSource(value DataSourceType.MASTER) 或者DataSource(value DataSourceType.SLAVE) Service public class SysPostServiceImpl implements ISysPostService {/*** 查询岗位信息集合* …

分享10个NodeJS相关的专业级工具

Node.js已成为开发人员创建强大且可扩展的Web应用程序的首选选项。根据2022年StackOverflow开发者调查&#xff0c;Node.js被评为专业开发人员中使用最广泛的Web框架。这个成功可以归功于其庞大的生态系统&#xff0c;其中提供了许多工具和框架。了解并接纳这个生态系统对于优化…

前端面试题-JS进阶

1 内置类型 JS 中分为七种内置类型&#xff0c;七种内置类型⼜分为两⼤类型&#xff1a;基本类型和对象&#xff08; Object &#xff09;。基本类型有六种&#xff1a; null &#xff0c; undefined &#xff0c; boolea n&#xff0c; number &#xff0c; string &#xff…

【数据动态填充到element表格;将带有标签的数据展示为文本格式】

一&#xff1a;数据动态填充到element表格&#xff1b; 二&#xff1a;将带有标签的数据展示为文本格式&#xff1b; 1、 <el-row><el-col :span"24"><el-tabs type"border-card"><el-tab-pane label"返回值"><el-…

计算机流水线在正常程序中的体现(效果可视)

众所周知,流水线技术对于软件开发人员不是可见的(visiable),毕竟已经在在机器语言之下,是组成机器语言的基本逻辑 但今天我就带领大家看看我新发现的结果,那就是流水线的可视效果,包括流水线预测技术的侧面体现,当然也是可见的 首先我先声明一下需要的基础,需要懂16位以及32位操…

leetcode 面试题01.04 回文排列

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;回文排列 思路&#xff1a;回文串两种可能。只有一个字符出现1次其他字符都是偶数次。要么都是偶数次。统计字母的个数即可。 代码&#xff1a; bool canPermutePalindrome(char* s){// 回文串两种可能// 1. 只有一个字…

几百本常用计算机开发语言电子书链接

GitHub - XiangLinPro/IT_book: 本项目收藏这些年来看过或者听过的一些不错的常用的上千本书籍&#xff0c;没准你想找的书就在这里呢&#xff0c;包含了互联网行业大多数书籍和面试经验题目等等。有人工智能系列&#xff08;常用深度学习框架TensorFlow、pytorch、keras。NLP、…