当前位置: 首页 > news >正文

C# 异步与 Unity 协程(实例讲解)

C#异步编程实例

假设我们有一个需要从Web获取数据的简单应用。我们可以使用C#的异步编程模型来避免UI线程被HTTP请求阻塞

1using System.Net.Http;
2using System.Threading.Tasks;
3
4public class AsyncExample
5{
6    public async Task<string> FetchDataFromWebAsync(string url)
7    {
8        using (var httpClient = new HttpClient())
9        {
10            try
11            {
12                // 异步发送GET请求
13                HttpResponseMessage response = await httpClient.GetAsync(url);
14                
15                // 确保请求成功
16                response.EnsureSuccessStatusCode();
17
18                // 异步读取响应内容为字符串
19                string responseBody = await response.Content.ReadAsStringAsync();
20
21                return responseBody;
22            }
23            catch (HttpRequestException ex)
24            {
25                Console.WriteLine($"Error fetching data from {url}: {ex.Message}");
26                return null;
27            }
28        }
29    }
30
31    public async void DisplayWebData()
32    {
33        string apiUrl = "https://api.example.com/data";
34        
35        // 使用异步方法获取数据
36        string data = await FetchDataFromWebAsync(apiUrl);
37
38        if (data != null)
39        {
40            Console.WriteLine("Fetched Data:");
41            Console.WriteLine(data);
42        }
43    }
44}
45
46// 使用示例
47public static void Main(string[] args)
48{
49    AsyncExample example = new AsyncExample();
50    example.DisplayWebData(); // 注意,此处并不等待异步操作完成
51    Console.WriteLine("主线程继续执行其他任务...");
52    // 若要等待DisplayWebData完成,可以考虑使用Task.Run(...)或ConfigureAwait(false)并在合适的地方等待任务结束
53}
异步HTTP请求

这个C#示例中,我们定义了一个名为FetchDataFromWebAsync的方法,它负责从指定URL异步获取数据。该方法使用了.NET框架中的System.Net.Http.HttpClient类来进行网络请求。

  1. 首先,我们创建一个新的HttpClient实例,这是一个用于执行HTTP请求的对象。

  2. 我们通过调用httpClient.GetAsync(url)发起一个异步GET请求。这一步会立即返回一个Task<HttpResponseMessage>,而实际的HTTP请求将在后台线程上执行。

  3. 使用await关键字等待GetAsync的结果,当HTTP响应可用时,代码会继续执行。

  4. 接下来,确保响应状态码表示成功(例如200 OK),然后通过response.Content.ReadAsStringAsync()发起另一个异步任务来读取响应体的内容。

  5. 最后,当响应体内容读取完毕后,方法返回字符串形式的响应体内容。

  6. DisplayWebData方法展示了如何调用此异步方法并在其完成后处理数据。注意,由于使用了async void,因此当调用此方法时,主线程不会等待异步操作完成。如果要在主线程中等待操作完成,通常会改用async Task并调用await

Unity协程实例

在Unity中,如果我们想要创建一个每两秒钟显示一次计数器的动画效果,可以使用协程来实现。

1using UnityEngine;
2using System.Collections;
3
4public class CoroutineExample : MonoBehaviour
5{
6    int count = 0;
7
8    IEnumerator CountEveryTwoSeconds()
9    {
10        while (true)
11        {
12            Debug.Log("Count: " + count++);
13            // 暂停协程2秒
14            yield return new WaitForSeconds(2f);
15        }
16    }
17
18    void Start()
19    {
20        // 开始执行协程
21        StartCoroutine(CountEveryTwoSeconds());
22    }
23}

在Unity脚本中,我们创建了一个协程函数CountEveryTwoSeconds,用于模拟每隔两秒打印一次计数器值。

  1. 定义一个整型变量count作为计数器。

  2. CountEveryTwoSeconds是一个IEnumerator类型的方法,它是Unity中协程的标志。通过在函数内部使用yield return语句,可以让函数在特定点暂停执行,并在指定时间后恢复。

  3. 在循环中,首先输出当前的计数器值到Unity的Console窗口。

  4. 使用yield return new WaitForSeconds(2f);使协程暂停2秒。WaitForSeconds是一个Unity内置的YieldInstruction,告诉Unity在指定的时间间隔后恢复执行协程。

  5. Start方法是Unity组件生命周期的一部分,在游戏对象激活时自动调用。在这个方法里,我们通过调用StartCoroutine(CountEveryTwoSeconds());来启动协程。

C#异步编程与Unity协程的区别

  1. 执行环境与用途

    • C#异步编程:主要用于.NET框架中的应用程序,特别是涉及到I/O密集型操作,如网络请求、文件读写、数据库查询等。异步编程的主要目的是充分利用系统资源,减少阻塞,提高程序的响应性和效率。
    • Unity协程:专为Unity游戏引擎设计,主要用于游戏逻辑的异步控制,如定时任务、动画序列、帧间延迟执行等。尽管Unity引擎本身在大部分情况下是单线程的,但协程能够在不阻塞主游戏循环的前提下,实现逻辑的暂停与恢复。
  2. 实现机制

    • C#异步编程:利用async/await关键字,背后由.NET Framework或Core提供支持,使用任务调度器(Task Scheduler)分配线程资源,可跨越多个线程执行任务。当遇到await时,当前方法会被拆分成若干个状态机,等待异步操作完成后继续执行剩余逻辑。
    • Unity协程:在Unity中,协程是通过IEnumerator接口和StartCoroutine函数实现的,执行过程是单线程的,并且遵循Unity的Update、FixedUpdate等游戏循环。通过yield return返回特定的Yield Instruction(如WaitForSecondsWWW等),在下一帧或指定条件达成时恢复执行。
  3. 资源管理

    • C#异步编程:通常与线程池结合使用,可以利用多核CPU资源,适合处理大量并发的异步任务。
    • Unity协程:由于Unity引擎的单线程特性,协程并不会创建额外的线程,而是依附于主线程,通过巧妙的逻辑控制实现类似异步的效果。
  4. 控制粒度

    • C#异步编程:可以细粒度地控制异步操作的每一个环节,例如使用ConfigureAwait控制上下文切换,或使用ContinueWithWhenAll等方法组合多个异步任务。
    • Unity协程:粒度相对固定,通常用于实现简单的延时、等待特定事件发生等情况,逻辑较简单直观。

 

相关文章:

C# 异步与 Unity 协程(实例讲解)

C#异步编程实例&#xff1a; 假设我们有一个需要从Web获取数据的简单应用。我们可以使用C#的异步编程模型来避免UI线程被HTTP请求阻塞 1using System.Net.Http; 2using System.Threading.Tasks; 3 4public class AsyncExample 5{ 6 public async Task<string> Fetch…...

iOS - Runloop介绍

文章目录 iOS - Runloop介绍1. 简介1.1 顾名思义1.2. 应用范畴1.3. 如果没有runloop1.4. 如果有了runloop 2. Runloop对象3. Runloop与线程4. 获取Runloop对象4.1 Foundation4.2 Core Foundation4.3 示例 5. Runloop相关的类5.1 Core Foundation中关于RunLoop的5个类5.2 CFRunL…...

探究分布式事务:深入ACID特性在分布式系统中的挑战与解决方案

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起进步&am…...

PCI总线管脚定义(引脚定义)

文章目录 1&#xff1a; 参考资料的链接2: 图片说明3&#xff1a;PCI文字说明每日好图 1&#xff1a; 参考资料的链接 PCI bus pinout PCI三种标准引脚信号定义 PCI bus pinout 2: 图片说明 A面和B面正反 PCI Universal Card 32/64 bit ----------------------------------…...

万字详解PHP+Sphinx中文亿级数据全文检索实战(实测亿级数据0.1秒搜索耗时)

Sphinx查询性能非常厉害&#xff0c;亿级数据下输入关键字&#xff0c;大部分能在0.01~0.1秒&#xff0c;少部分再5秒之内查出数据。 Sphinx 官方文档&#xff1a;http://sphinxsearch.com/docs/sphinx3.html极简概括&#xff1a; 由C编写的高性能全文搜索引擎的开源组件&…...

数据库索引及优化

数据库索引及优化 什么是索引&#xff1f; MySQL官方对索引的定义为&#xff1a;索引&#xff08;INDEX&#xff09;是帮助MySQL高效获取数据的数据结构。 索引的本质&#xff1a; 数据结构 为什么要引入索引&#xff1f; 引入索引的目的在于提高查询效率&#xff0c;就好像是…...

flink: 将接收到的tcp文本流写入HBase

一、依赖&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.o…...

SpringBoot集成knife4j

SpringBoot集成knife4j 1、什么是Knife4j2、SpringBoor整合Knife4j2.1、Knife4j配置方式12.2 配置方式二2.3、写注解2.4、效果 1、什么是Knife4j 在日常开发中&#xff0c;写接口文档是我们必不可少的&#xff0c;而Knife4j就是一个接口文档工具&#xff0c;可以看作是Swagger…...

Vue3之setup方法

Vue 3 的 setup 方法是 Vue Composition API 的一部分&#xff0c;用于组织和复用 Vue 组件的逻辑代码。Vue Composition API 允许您以更具响应性和函数式的方式来组织和复用 Vue 组件中的代码&#xff0c;特别是在处理复杂逻辑或跨组件共享逻辑时非常有用。 以下是关于 setup…...

MySQL常见索引及其创建

MySQL索引 在 MySQL 数据库中&#xff0c;常见的索引类型包括以下几种&#xff1a; 普通索引&#xff08;Normal Index&#xff09;&#xff1a;最基本的索引类型&#xff0c;没有任何限制。唯一索引&#xff08;Unique Index&#xff09;&#xff1a;要求索引列的值是唯一的…...

高效测量“芯”搭档 | ACM32激光测距仪应用方案

激光测距仪概述 激光测距仪是利用激光对目标的距离进行准确测定的仪器。激光测距仪在工作时向目标射出一束很细的激光&#xff0c;由光电元件接收目标反射的激光束&#xff0c;计时器测定激光束从发射到接收的时间&#xff0c;计算出从观测者到目标的距离。激光测距仪分为手持激…...

基于Hive大数据分析springboot为后端以及vue为前端的的民宿系

标题基于Hive大数据分析springboot为后端以及vue为前端的的民宿系 本文介绍了如何利用Hive进行大数据分析,并结合Spring Boot和Vue构建了一个民宿管理系统。该民民宿管理系统包含用户和管理员登陆注册的功能,发布下架酒店信息,模糊搜索,酒店详情信息展示,收藏以及对收藏的…...

pnpm、monorepo分包管理、多包管理、npm、vite、前端工程化、保姆级教程

浅尝pnpm monorepo 多包管理方案 &#x1f4a1;tips: 创建pnpm monorope多包管理框架流程 初始化 mkdir taurus & cd taurus pnpm init创建基础文件 创建文件pnpm-workspace.yaml packages:- packages/**创建文件夹packages/ -packages/ -package.json -pnpm-workspace…...

vue3封装Element分页

配置当前页 配置每页条数 页面改变、每页条数改变都触发回调 封装分页 Pagination.vue <template><el-paginationbackgroundv-bind"$attrs":page-sizes"pageSizes"v-model:current-page"page"v-model:page-size"pageSize":t…...

真机 ARM64 架构转模拟器 ARM64 架构

本文字数&#xff1a;2051字 预计阅读时间&#xff1a;15分钟 01 需要转换架构的原因 老版 Mac 使用 Intel 芯片&#xff0c;是x86_64架构&#xff0c;相应地在老版 Mac 上运行的模拟器使用的也就是 x86_64架构。 由于模拟器的 x86_64 架构与真机的 arm64、armv7 等架构不冲突&…...

敏捷教练CSM认证考了有没有用,谁说了算?

敏捷教练CSM证书是近年来备受关注的一项证书&#xff0c;它被认为可以提升敏捷开发团队的管理能力和项目执行效率。然而&#xff0c;对于这个证书的价值和含金量&#xff0c;人们的观点却不尽相同。那么&#xff0c;CSM证书到底有没有用&#xff0c;谁来说了算呢&#xff1f; 首…...

Docker-Container

Docker ①什么是容器②为什么需要容器③容器的生命周期容器 OOM容器异常退出容器暂停 ④容器命令清单总览docker createdocker rundocker psdocker logsdocker attachdocker execdocker startdocker stopdocker restartdocker killdocker topdocker statsdocker container insp…...

下载安装anaconda和pytorch的详细方法,以及遇到的问题和解决办法

下载安装Anaconda 首先需要下载Anaconda&#xff0c;可以到官网Anaconda官网或者这里提供一个镜像网站去下载anaconda镜像网站 安装步骤可参考该文章&#xff1a;Anaconda安装步骤&#xff0c;本篇不再赘述 注意环境变量的配置&#xff0c;安装好Anaconda之后一定要在环境变量…...

2020年天津市二级分类土地利用数据(矢量)

天津市&#xff0c;位于华北平原海河五大支流汇流处&#xff0c;东临渤海&#xff0c;北依燕山。地势以平原和洼地为主&#xff0c;北部有低山丘陵&#xff0c;海拔由北向南逐渐下降&#xff0c;地貌总轮廓为西北高而东南低。天津有山地、丘陵和平原三种地形&#xff0c;平原约…...

设计模式——结构型——外观模式Facade

处理器类 public class Cpu {public void start() {System.out.println("处理器启动了...");} } 内存类 public class Memory {public void start() {System.out.println("内存启动了...");} } 硬盘类 public class Disk {public void start() {Syste…...

OpenGL的MVP矩阵理解

OpenGL的MVP矩阵理解 右手坐标系 右手坐标系与左手坐标系都是三维笛卡尔坐标系&#xff0c;他们唯一的不同在于z轴的方向&#xff0c;如下图&#xff0c;左边是左手坐标系&#xff0c;右边是右手坐标系 OpenGL中一般用的是右手坐标系 1.模型坐标系&#xff08;Local Space&…...

前端超分辨率技术应用:图像质量提升与场景实践探索-设计篇

超分辨率&#xff01; 引言 在数字化时代&#xff0c;图像质量对于用户体验的重要性不言而喻。随着显示技术的飞速发展&#xff0c;尤其是移动终端视网膜屏幕的广泛应用&#xff0c;用户对高分辨率、高质量图像的需求日益增长。然而&#xff0c;受限于网络流量、存储空间和图像…...

C++11入门手册第一节,学完直接上手Qt(共两节)

入门 hello.cpp #include <iostream>int main() { std::cout << "Hello Quick Reference\n"<<endl; return 0;} 编译运行 $ g hello.cpp -o hello$ ./hello​Hello Quick Reference 变量 int number 5; // 整数float f 0.95; //…...

Docker部署MinIO对象存储服务

1. 拉取MinIO镜像 # 下载镜像 docker pull minio/minio#查看镜像 docker images2. 创建目录 # 文件存储目录 mkdir -p /opt/minio/data# 配置文件 mkdir -p /opt/minio/config# 日志文件 mkdir -p /opt/minio/logs3. 创建Minio容器并运行 docker run \ -p 9000:9000 \ -p 90…...

基于Echarts的超市销售可视化分析系统(数据+程序+论文)

本论文旨在研究Python技术和ECharts可视化技术在超市销售数据分析系统中的应用。本系统通过对超市销售数据进行分析和可视化展示&#xff0c;帮助决策层更好地了解销售情况和趋势&#xff0c;进而做出更有针对性的决策。本系统主要包括数据处理、数据可视化和系统测试三个模块。…...

使用ai智能写作场景之gpt整理资料,如何ai智能写作整理资料

Ai智能写作助手&#xff1a;Ai智能整理资料小助手 Ai智能整理资料小助手可试用3天&#xff01; 通俗的解释一下怎么用ChatGPT来进行资料整理&#xff1a; 搜寻并获取指定数量的特定领域文章&#xff1a; 想像你在和我说话一样&#xff0c;告诉我你想要多少篇关于某个话题的文…...

C/C++ 内存管理

1、C/C内存分布 首先我们来了解在一个程序中&#xff0c;代码主要存储在哪些地方&#xff1b; 1.栈&#xff1a;又叫堆栈&#xff0c;其中一般存储非静态局部变量、函数参数、返回值等&#xff0c;栈的增长是向下的。 2.内存映射段&#xff1a;是高效的 I/O 映射方式&#xff0…...

android pdf框架-10,相册浏览

MupdfViewer 这是最后apk,源码在前面的文章已经贴过了本站下载地址,只是不是最新的.可能不少是旧的内容. subsampling-scale-image-view这是一个大图片的分块加载的实现.比较不错的.滑动方面我觉得使用flinger的效果比它要流畅,惯性要好. 也有人把这个作成pdf渲染器.但翻页就…...

基于SSM的高校普法系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的高校普法系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…...

数据结构刷题篇 之 【力扣二叉树基础OJ】详细讲解(含每道题链接及递归图解)

有没有一起拼用银行卡的&#xff0c;取钱的时候我用&#xff0c;存钱的时候你用 1、相同的树 难度等级&#xff1a;⭐ 直达链接&#xff1a;相同的树 2、单值二叉树 难度等级&#xff1a;⭐ 直达链接&#xff1a;单值二叉树 3、对称二叉树 难度等级&#xff1a;⭐⭐ 直达…...

广州越秀区天气预报15天查询/乐陵seo优化

在前面随笔《基于Metronic的Bootstrap开发框架--工作流模块功能介绍》和《基于Metronic的Bootstrap开发框架--工作流模块功能介绍&#xff08;2&#xff09;》中介绍了Bootstrap开发框架的工作模块功能&#xff0c;前面文章也提及&#xff0c;通过代码生成工具直接生成对应的Cr…...

wordpress导航栏制作/济南优化网页

在《敏捷个人价值观&#xff0c;欢迎提出你的意见和你的价值观》中我介绍了一下我对敏捷个人价值观的一点初步理解&#xff0c;在这里也很感谢大家对blog的积极回复以及直接给我发邮件进行交流&#xff0c;你们的反馈是我们完善敏捷个人的最好参与方式。 大家对价值观的态度 上…...

用nas 做网站/360营销平台

整理了一份全国省市区SQL插入脚本&#xff0c;并配上抓取数据读取插入数据库源码&#xff0c;附件下载地址&#xff1a;https://files.cnblogs.com/files/101Love/Region.rar 转载于:https://www.cnblogs.com/101Love/p/7493868.html...

做英语题目的网站/百度做广告怎么做

JVM监控工具 Java的安装包自带了很多优秀的工具&#xff0c;善用这些工具对于监控和调试Java程序非常有帮助。常用工具如下&#xff1a; jps 用途&#xff1a;jps用来查看JVM里面所有进程的具体状态, 包括进程ID&#xff0c;进程启动的路径等等。 常用参数&#xff1a; -l: 输…...

惠阳开发网站建设/全媒体广告投放平台

点击上方"蓝字"关注我们&#xff0c;享更多干货&#xff01;索引分裂&#xff08;Index Block Split&#xff09;&#xff0c;就是索引块的分裂。当一次DML操作修改了索引块上的数据&#xff0c;但是旧有的索引块没有足够的空间去容纳新修改的数据时&#xff0c;将分…...

华讯网络工程师待遇/晋城seo

Develeper app上没有找到 网页登录开发者账号也没有找到 打电话给苹果&#xff0c;说是在iPhone 设置 --> apple id --> 订阅。我点击进去显示“您没有任何订阅项目” 登录apple developer的网址&#xff0c;要苹果打电话给我。貌似下午4点以后&#xff0c;苹果就不会…...