C# Unity 同步/异步编程和多线程什么关系?async/await和coroutine又是什么?

目录 不用模板生成的目录怎么这么丑啊

1.同步?异步?多线程?

2.async/await和coroutine?

证明

单线程中的同步/异步

多线程中的同步异步

1.同步?异步?多线程?

首先,你需要知道什么是同步编程,什么是异步编程

同步编程:所有代码按顺序执行,直到当前任务完成后才开始下一个任务

异步编程:代码可以在等待某些任务完成时继续执行其他任务

其次,你需要知道什么是多线程

多线程:是一种并发编程技术,允许一个程序同时执行多个线程

好,既然你能明白概念,说明你非常聪明,可以直接上第一个结论了

当然不懂也没关系,先有个印象我会说明为什么

2.async/await和coroutine?

我直接指名加油站,看懂了就行,二者都是异步处理的解决方法

async/await:async/await 用法,看这一篇就够了_async await用法-CSDN博客

coroutine:unity保姆级教程之协同程序_unity 协同程序实现原理-CSDN博客

请看下图结论 

证明

单线程中的同步/异步

所有代码按顺序执行,直到当前任务完成后才开始下一个任务

举一个我家老太太都会写的例子

public class Single : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){Func1();Func2();}void Func1(){Debug.Log("这是函数1 所需要执行的话");}void Func2() {Debug.Log("这是函数2 所需要执行的话");}
}

结果,注意时间

就相当于如此

代码可以在等待某些任务完成时继续执行其他任务

用协程函数

public class Single : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){StartCoroutine(Wait());}IEnumerator Wait(){Func1();yield return new WaitForSeconds(1.0f);Func2 ();}void Func1(){Debug.Log("这是函数1 所需要执行的话");}void Func2() {Debug.Log("这是函数2 所需要执行的话");}
}

注意时间 

用async/await

public class Single : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){Wait();}async void Wait() {Func1();await Task.Delay(1000); // 等待1秒Func2();}

结果当然是毫不意外

 二者用图解 皆是如此

牢记这句话:代码可以在等待某些任务完成时继续执行其他任务

我可以在这1s打个胶还是什么都行,是不是非常严谨

多线程中的同步异步

多线程会遇到一个问题,就是新开的线程是独立的,并不会受到启动顺序的影响

比如:

  void Start(){Thread t1 = new Thread(Func1);Thread t2 =new Thread(Func2);t1.Start();t2.Start();}

那么就会出现这种情况:

即:有时候会是func1先执行,有时候会使func2先执行

那么要是使其实现同步的话,就需要加一个小小的类ManualResetEvent 类 (System.Threading) | Microsoft Learn

这样就可以实现,所有代码按顺序执行,直到当前任务完成后才开始下一个任务

public class Single : MonoBehaviour
{ManualResetEvent resetEvent = new ManualResetEvent(false);// Start is called before the first frame updatevoid Start(){Thread t1 = new Thread(Func1);Thread t2 =new Thread(Func2);t1.Start();t2.Start();}void Func1(){Debug.Log("这是函数1 所需要执行的话");resetEvent.Set();}void Func2() {resetEvent.WaitOne();Debug.Log("这是函数2 所需要执行的话"); }
}

 另外你需要注意的一个点就是在unity中,其有自己的一个主线程用于执行生命周期函数,图解如下:

代码可以在等待某些任务完成时继续执行其他任务

public class Single : MonoBehaviour {// TaskCompletionSource 用于在异步任务之间传递信号private TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();async void Start() {Task t1= Func1();Debug.Log("看看这句话是在哪执行的1");Task t2 = Func2();Debug.Log("看看这句话是在哪执行的2");// 等待两个任务都完成await Task.WhenAll(t1, t2);}async Task Func1() {Debug.Log("这是函数1 所需要执行的话");// 设置 TaskCompletionSource 的结果,通知 Func2 可以继续执行tcs.SetResult(true);}async Task Func2() {// 等待 Func1 完成await tcs.Task;// 延迟一秒await Task.Delay(1000);Debug.Log("这是函数2 所需要执行的话");}
}

这我就不得不多说两句了,在这段代码中unity有自己的主线程,而t1和t2是副线程

当调用t1和t2时,这两个线程会在后台并行执行,而主线程会继续执行后续的代码。主线程和工作线程之间是并行运行的,互不阻塞

协程同理

public class Single : MonoBehaviour {Thread t1;Thread t2;void Start() {t1 = new Thread(Func1);t2 = new Thread(Func2);Debug.Log("看看这句话输出在哪里1");StartCoroutine(wait());Debug.Log("看看这句话输出在哪里2");}IEnumerator wait(){ t1.Start();yield return new WaitForSeconds(1.0f);t2.Start ();}// 异步方法 Func1void Func1() {// 输出调试信息Debug.Log("这是函数1 所需要执行的话");}// 异步方法 Func2void Func2() {Debug.Log("这是函数2 所需要执行的话");}
}

输出结果很意思,这明显不是按照顺序来的

更加证明了这是异步的,记住:代码可以在等待某些任务完成时继续执行其他任务

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

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

相关文章

前端经典【面试题】持续更新HTML、CSS、JS、VUE、FLUTTER、性能优化等

HTML/CSS 面试题 什么是语义化 HTML&#xff1f; 说明&#xff1a;语义化 HTML 使用 HTML 标签来描述内容的含义&#xff0c;而不仅仅是其外观。使用语义化标签可以提高可读性和可访问性&#xff0c;并对 SEO 友好。示例&#xff1a; <header><h1>网站标题</h1&…

第二代 GPT-SoVITS V2:解锁语音克隆与合成的无限可能

在 AI 技术蓬勃发展的今天&#xff0c;第二代 GPT-SoVITS V2 如一颗璀璨的明星闪耀登场&#xff0c;为语音处理领域带来了前所未有的变革。它是一款集先进技术与强大功能于一身的声音克隆与语音合成工具&#xff0c;由 RVC 变声器创始人 “花儿不哭” 与 AI 音色转换技术 Sovit…

sharpkeys-键盘部分按键不好用,用其它不常用按键代替

sharpkeys-键盘部分按键不好用&#xff0c;用其它不常用按键代替 文章目录

Rust的move关键字在线程中的使用

为什么使用 move&#xff1f; 在 Rust 中&#xff0c;move 关键字主要用于闭包。当我们在一个线程中创建一个闭包并将其传递给另一个线程时&#xff0c;如果闭包中使用了某些变量&#xff0c;就需要决定这些变量的所有权归属。 不使用 move&#xff1a; 默认情况下&#xff0…

前端开发:Vue中数据绑定原理

Vue 中最大的一个特征就是数据的双向绑定&#xff0c;而这种双向绑定的形式&#xff0c;一方面表现在元数据与衍生数据之间的响应&#xff0c;另一方面表现在元数据与视图之间的响应&#xff0c;而这些响应的实现方式&#xff0c;依赖的是数据链&#xff0c;因此&#xff0c;要…

Pytorch与深度学习 #10.PyTorch训练好的模型如何部署到Tensorflow环境中

1. Tensorflow vs Pytorch 在这个AI时代&#xff0c;各大厂商都在主推自家的AI框架&#xff0c;因此知名和不知名的大大小小可能十来种。但是我们选型的时候&#xff0c;一般首先考虑是Google家的Tensorflow呢还是Meta家的Pytorch。 在选择 PyTorch 或 TensorFlow 进行工业级…

苏州金龙技术创新赋能旅游新质生产力

2024年10月23日&#xff0c;备受瞩目的“2024第六届旅游出行大会”在云南省丽江市正式开幕。作为客车行业新质生产力标杆客车&#xff0c;苏州金龙在大会期间现场展示了新V系V12商旅版、V11和V8E纯电车型&#xff0c;为旅游出行提供全新升级方案。 其中&#xff0c;全新15座V1…

【vue 全家桶】1、vue 基础(更新中)

目录 Vue 核心Vue 简介模板语法插值语法 {{}}指令语法 v- 数据绑定单向数据绑定 v-bind双向数据绑定 v-model MVVM模型事件处理计算属性与监视class 与 style 绑定条件渲染列表渲染收集表单数据过滤器内置指令与自定义指令Vue 实例生命周期 Vue 组件化编程模块与组件、模块化与…

Python | Leetcode Python题解之第508题出现次数最多的子树元素和

题目&#xff1a; 题解&#xff1a; class Solution:def findFrequentTreeSum(self, root: TreeNode) -> List[int]:cnt Counter()def dfs(node: TreeNode) -> int:if node is None:return 0sum node.val dfs(node.left) dfs(node.right)cnt[sum] 1return sumdfs(r…

【linux】服务器Ubuntu20.04安装cuda11.8教程

【linux】服务器Ubuntu20.04安装cuda11.8教程 文章目录 【linux】服务器Ubuntu20.04安装cuda11.8教程到官网找到对应版本下载链接终端操作cudnn安装到官网下载下载后解压进入解压后的目录&#xff1a;将头文件复制到 /usr/local/cuda/include/ 目录&#xff1a;将库文件复制到 …

语音语言模型最新综述! 关于GPT-4o背后技术的尝试

近期,大型语言模型(LLMs)在生成文本和执行各种自然语言处理任务方面展现出了卓越的能力,成为了强大的AI驱动语言理解和生成的基础模型。然而&#xff0c;仅依赖于基于文本模态的模型存在显著局限性。这促使了基于语音的生成模型的发展,使其能够更自然、直观地与人类互动。 为了…

在银河麒麟系统中Qt连接达梦数据库

解决在银河麒麟系统中使用Qt连接达梦数据库提示&#xff1a;project Error library odbc is not defined问题 一、编译ODBC 下载解压unixODBC&#xff08;http://www.unixodbc.org/unixODBC-2.3.1.tar.gz&#xff09; 打开终端&#xff0c;切换到unixODBC-2.3.1目录下&#x…

海螺 2.27.1 |AI生成视频 AI音乐 语音通话

嗨&#xff01;我是小海螺&#xff0c;你的AI智能伙伴&#xff0c;帮助你学习工作效率加倍&#xff01;我无所不知&#xff0c;又像朋友陪你左右&#xff0c;遇到问题&#xff0c;就问我吧。我所使用的技术&#xff0c;是MiniMax公司自研的万亿参数MoE大模型。我们希望能与用户…

【北京迅为】itop-龙芯2k1000开发指南Linux基础入门vim 编辑器

【北京迅为】itop-龙芯2k1000开发指南Linux基础入门vim 编辑器 龙芯2K1000处理器集成2个64位GS264处理器核&#xff0c;主频1GHz&#xff0c;以及各种系统IO接口&#xff0c;集高性能与高配置于一身。支持4G模块、GPS模块、千兆以太网、16GB固态硬盘、双路UART、四路USB、WIFI蓝…

沈阳乐晟睿浩科技有限公司抖音小店领域的强者

在当今数字化浪潮的推动下&#xff0c;电子商务以其便捷性、高效性和广泛的覆盖面&#xff0c;成为了推动经济发展的新引擎。而抖音小店&#xff0c;作为短视频平台上的新兴电商形态&#xff0c;更是凭借其庞大的用户基础、精准的内容推送机制以及独特的购物体验&#xff0c;迅…

使用query-string库出现错误Module parse failed: Unexpected token

环境 node v12query-string 9.1.0 报错信息 Failed to compile../node_modules/query-string/base.js 350:14 Module parse failed: Unexpected token (350:14) File was processed with these loaders:* ./node_modules/babel-loader/lib/index.js You may need an additio…

【Multisim14.0正弦波>方波>三角波】2022-6-8

缘由有没有人会做啊Multisim14.0-其他-CSDN问答参考方波、三角波、正弦波信号产生 - 豆丁网

echarts给Y轴的不同轴线设置不同的颜色的样式

官方文档 option {xAxis: {type: category,data: [Mon, Tue, Wed, Thu, Fri, Sat, Sun]},yAxis: {type: value},series: [{data: [150, 230, 224, 218, 135, 147, 260],type: line,}] }; 效果&#xff1a; 需要添加参数markLine option {xAxis: {type: category,data: [M…

Mycat2安装配置

安装配置 安装 目前Mycat2下载地址已经不可访问&#xff0c;安装包可从参考资料[1]获取 下载后解压zip文件&#xff0c;将jar放在lib目录下 编辑配置文件 编辑conf文件夹下的prototypeDs.datasource.json 更改数据库相关信息 启动 windows环境下启动Mycat 以管理员身份运行…

威胁 Windows 和 Linux 系统的新型跨平台勒索软件:Cicada3301

近年来&#xff0c;网络犯罪世界出现了新的、日益复杂的威胁&#xff0c;能够影响广泛的目标。 这一领域最令人担忧的新功能之一是Cicada3301勒索软件&#xff0c;最近由几位网络安全专家进行了分析。他们有机会采访了这一危险威胁背后的勒索软件团伙的成员。 Cicada3301的崛…