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类来进行网络请求。
-
首先,我们创建一个新的
HttpClient实例,这是一个用于执行HTTP请求的对象。 -
我们通过调用
httpClient.GetAsync(url)发起一个异步GET请求。这一步会立即返回一个Task<HttpResponseMessage>,而实际的HTTP请求将在后台线程上执行。 -
使用
await关键字等待GetAsync的结果,当HTTP响应可用时,代码会继续执行。 -
接下来,确保响应状态码表示成功(例如200 OK),然后通过
response.Content.ReadAsStringAsync()发起另一个异步任务来读取响应体的内容。 -
最后,当响应体内容读取完毕后,方法返回字符串形式的响应体内容。
-
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,用于模拟每隔两秒打印一次计数器值。
-
定义一个整型变量
count作为计数器。 -
CountEveryTwoSeconds是一个IEnumerator类型的方法,它是Unity中协程的标志。通过在函数内部使用yield return语句,可以让函数在特定点暂停执行,并在指定时间后恢复。 -
在循环中,首先输出当前的计数器值到Unity的Console窗口。
-
使用
yield return new WaitForSeconds(2f);使协程暂停2秒。WaitForSeconds是一个Unity内置的YieldInstruction,告诉Unity在指定的时间间隔后恢复执行协程。 -
Start方法是Unity组件生命周期的一部分,在游戏对象激活时自动调用。在这个方法里,我们通过调用StartCoroutine(CountEveryTwoSeconds());来启动协程。
C#异步编程与Unity协程的区别:
-
执行环境与用途:
- C#异步编程:主要用于.NET框架中的应用程序,特别是涉及到I/O密集型操作,如网络请求、文件读写、数据库查询等。异步编程的主要目的是充分利用系统资源,减少阻塞,提高程序的响应性和效率。
- Unity协程:专为Unity游戏引擎设计,主要用于游戏逻辑的异步控制,如定时任务、动画序列、帧间延迟执行等。尽管Unity引擎本身在大部分情况下是单线程的,但协程能够在不阻塞主游戏循环的前提下,实现逻辑的暂停与恢复。
-
实现机制:
- C#异步编程:利用
async/await关键字,背后由.NET Framework或Core提供支持,使用任务调度器(Task Scheduler)分配线程资源,可跨越多个线程执行任务。当遇到await时,当前方法会被拆分成若干个状态机,等待异步操作完成后继续执行剩余逻辑。 - Unity协程:在Unity中,协程是通过
IEnumerator接口和StartCoroutine函数实现的,执行过程是单线程的,并且遵循Unity的Update、FixedUpdate等游戏循环。通过yield return返回特定的Yield Instruction(如WaitForSeconds、WWW等),在下一帧或指定条件达成时恢复执行。
- C#异步编程:利用
-
资源管理:
- C#异步编程:通常与线程池结合使用,可以利用多核CPU资源,适合处理大量并发的异步任务。
- Unity协程:由于Unity引擎的单线程特性,协程并不会创建额外的线程,而是依附于主线程,通过巧妙的逻辑控制实现类似异步的效果。
-
控制粒度:
- C#异步编程:可以细粒度地控制异步操作的每一个环节,例如使用
ConfigureAwait控制上下文切换,或使用ContinueWith、WhenAll等方法组合多个异步任务。 - Unity协程:粒度相对固定,通常用于实现简单的延时、等待特定事件发生等情况,逻辑较简单直观。
- C#异步编程:可以细粒度地控制异步操作的每一个环节,例如使用
相关文章:
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> 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特性在分布式系统中的挑战与解决方案
✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 🎈🎈作者主页: 喔的嘛呀🎈🎈 ✨✨ 帅哥美女们,我们共同加油!一起进步&am…...
PCI总线管脚定义(引脚定义)
文章目录 1: 参考资料的链接2: 图片说明3:PCI文字说明每日好图 1: 参考资料的链接 PCI bus pinout PCI三种标准引脚信号定义 PCI bus pinout 2: 图片说明 A面和B面正反 PCI Universal Card 32/64 bit ----------------------------------…...
万字详解PHP+Sphinx中文亿级数据全文检索实战(实测亿级数据0.1秒搜索耗时)
Sphinx查询性能非常厉害,亿级数据下输入关键字,大部分能在0.01~0.1秒,少部分再5秒之内查出数据。 Sphinx 官方文档:http://sphinxsearch.com/docs/sphinx3.html极简概括: 由C编写的高性能全文搜索引擎的开源组件&…...
数据库索引及优化
数据库索引及优化 什么是索引? MySQL官方对索引的定义为:索引(INDEX)是帮助MySQL高效获取数据的数据结构。 索引的本质: 数据结构 为什么要引入索引? 引入索引的目的在于提高查询效率,就好像是…...
flink: 将接收到的tcp文本流写入HBase
一、依赖: <?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 在日常开发中,写接口文档是我们必不可少的,而Knife4j就是一个接口文档工具,可以看作是Swagger…...
Vue3之setup方法
Vue 3 的 setup 方法是 Vue Composition API 的一部分,用于组织和复用 Vue 组件的逻辑代码。Vue Composition API 允许您以更具响应性和函数式的方式来组织和复用 Vue 组件中的代码,特别是在处理复杂逻辑或跨组件共享逻辑时非常有用。 以下是关于 setup…...
MySQL常见索引及其创建
MySQL索引 在 MySQL 数据库中,常见的索引类型包括以下几种: 普通索引(Normal Index):最基本的索引类型,没有任何限制。唯一索引(Unique Index):要求索引列的值是唯一的…...
高效测量“芯”搭档 | ACM32激光测距仪应用方案
激光测距仪概述 激光测距仪是利用激光对目标的距离进行准确测定的仪器。激光测距仪在工作时向目标射出一束很细的激光,由光电元件接收目标反射的激光束,计时器测定激光束从发射到接收的时间,计算出从观测者到目标的距离。激光测距仪分为手持激…...
基于Hive大数据分析springboot为后端以及vue为前端的的民宿系
标题基于Hive大数据分析springboot为后端以及vue为前端的的民宿系 本文介绍了如何利用Hive进行大数据分析,并结合Spring Boot和Vue构建了一个民宿管理系统。该民民宿管理系统包含用户和管理员登陆注册的功能,发布下架酒店信息,模糊搜索,酒店详情信息展示,收藏以及对收藏的…...
pnpm、monorepo分包管理、多包管理、npm、vite、前端工程化、保姆级教程
浅尝pnpm monorepo 多包管理方案 💡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 架构
本文字数:2051字 预计阅读时间:15分钟 01 需要转换架构的原因 老版 Mac 使用 Intel 芯片,是x86_64架构,相应地在老版 Mac 上运行的模拟器使用的也就是 x86_64架构。 由于模拟器的 x86_64 架构与真机的 arm64、armv7 等架构不冲突&…...
敏捷教练CSM认证考了有没有用,谁说了算?
敏捷教练CSM证书是近年来备受关注的一项证书,它被认为可以提升敏捷开发团队的管理能力和项目执行效率。然而,对于这个证书的价值和含金量,人们的观点却不尽相同。那么,CSM证书到底有没有用,谁来说了算呢? 首…...
Docker-Container
Docker ①什么是容器②为什么需要容器③容器的生命周期容器 OOM容器异常退出容器暂停 ④容器命令清单总览docker createdocker rundocker psdocker logsdocker attachdocker execdocker startdocker stopdocker restartdocker killdocker topdocker statsdocker container insp…...
下载安装anaconda和pytorch的详细方法,以及遇到的问题和解决办法
下载安装Anaconda 首先需要下载Anaconda,可以到官网Anaconda官网或者这里提供一个镜像网站去下载anaconda镜像网站 安装步骤可参考该文章:Anaconda安装步骤,本篇不再赘述 注意环境变量的配置,安装好Anaconda之后一定要在环境变量…...
2020年天津市二级分类土地利用数据(矢量)
天津市,位于华北平原海河五大支流汇流处,东临渤海,北依燕山。地势以平原和洼地为主,北部有低山丘陵,海拔由北向南逐渐下降,地貌总轮廓为西北高而东南低。天津有山地、丘陵和平原三种地形,平原约…...
设计模式——结构型——外观模式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…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
