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.rhkb.cn/news/456854.html

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

相关文章

模型选择拟合

1.通过多项式拟合交互探索概念 import math import numpy as np import torch from torch import nn from d2l import torch as d2l 2.使用三阶多项式来生成训练和测试数据的标签 max_degree 20 # 多项式的最大阶数 n_train, n_test 100, 100 # 训练和测试数据集大小 true…

手动改造UPX壳,增加IAT保护

随便拿Delphi7&#xff0c;新建一个VCL窗体程序&#xff0c;画一个按钮&#xff0c;写两行代码。这一步骤讲究的是什么呢&#xff1f;率性而为&#xff0c;反正没什么卵用。比如&#xff0c;俺写的是这玩意。 <span style"color:#666666"><span style"…

FFMPEG+Qt 实时显示本机USB摄像头1080p画面以及同步录制mp4视频

FFMPEGQt 实时显示本机USB摄像头1080p画面以及同步录制mp4视频 文章目录 FFMPEGQt 实时显示本机USB摄像头1080p画面以及同步录制mp4视频1、前言1.1 目标1.2 一些说明 2、效果3、代码3.1 思路3.2 工程目录3.3 核心代码 4、全部代码获取 1、前言 本文通过FFMPEG(7.0.2)与Qt(5.13.…

YOLO系列入门:1、YOLO V11环境搭建

YOLO了解 yolo检测原理 yolo是目标检测模型&#xff0c;目标检测包含物体分类、位置预测两个内容。目前yolo的开发公司官网为&#xff1a;https://docs.ultralytics.com/zh截止到目前2024年10月&#xff0c;最新的是yolo11。关于YOLO的介绍可以参考这篇文章&#xff1a;https…

Python+Django+VUE 搭建深度学习训练界面 (持续ing)

PythonDjangoVUE 搭建深度学习训练界面 &#xff08;持续ing&#xff09; 环境说明 Pycharm 专业版2024.1.4&#xff0c;社区版不支持网页开发 下载链接&#xff1a;https://www.jetbrains.com/pycharm/download/other.html 参考链接&#xff1a;https://www.quanxiaoha.co…

es实现桶聚合

目录 聚合 聚合的分类 DSL实现桶聚合 dsl语句 结果 聚合结果排序 限定聚合范围 总结 聚合必须的三要素&#xff1a; 聚合可配置的属性 DSL实现metric聚合 例如&#xff1a;我们需要获取每个品牌的用户评分的min,max,avg等值 只求socre的max 利用RestHighLevelClien…

BIO,NIO,直接内存,零拷贝

前置知识 什么是Socket&#xff1f; Socket是应用层与TCP/IP协议族通信的中间软件抽象层&#xff0c;它是一组接口&#xff0c;一般由操作系统提供。在设计模式中&#xff0c;Socket其实就是一个门面模式&#xff0c;它把复杂的TCP/IP协议处理和通信缓存管理等等都隐藏在Sock…

vue3使用i18n做国际化多语言,实现常量跟随语言切换翻译

因为我有一个常量的配置文件在项目中&#xff0c;而且有中文内容&#xff0c;我想在切换语言的时候&#xff0c;跟着这个翻译也实时切换&#xff0c;就可以使用computed计算属性实现。 把name改成下面的样子&#xff1a; name: computed(() > t(pad.regularMode)), 就可以…

分享一款录屏、直播软件

光音录屏 光音录屏 是新一代的录屏工具&#xff0c;跟传统录屏工具相比&#xff0c;它不仅可以录制屏幕&#xff0c;还可以同时录制「人像 屏幕」&#xff0c;此外它还提供了美颜、虚拟背景、绿幕抠像、图片、文本编辑、字幕、白板等更多高级功能。你可以将录制好的视频&…

ue5实现数字滚动增长

方法1 https://www.bilibili.com/video/BV1h14y197D1/?spm_id_from333.999.0.0 b站教程 重写loop节点 方法二 写在eventtick里

ffmpeg视频滤镜: 色温- colortemperature

滤镜简述 colortemperature 官网链接 》 FFmpeg Filters Documentation 这个滤镜可以调节图片的色温&#xff0c;色温值越大显得越冷&#xff0c;可以参考一下下图&#xff1a; 咱们装修的时候可能会用到&#xff0c;比如选择灯还有地板的颜色的时候&#xff0c;选暖色调还是…

多厂商的实现不同vlan间通信

Cisco单臂路由 Cisco路由器配置 -交换机配置 -pc配置 华三的单臂路由 -路由器配置 -华三的接口默认是打开的 -pc配置及ping的结果 -注意不要忘记配置默认网关 Cisco-SVI -交换机的配置 -创建vlan -> 设置物理接口对应的Acess或Trunk -> 进入vlan接口&#xff0c;打开接…

【纯血鸿蒙】HarmonyOS和OpenHarmony 的区别

一、开源鸿蒙&#xff08;Open Harmony&#xff09; 鸿蒙系统愿来的设计初衷&#xff0c;就是让所有设备都可以运行一个系统&#xff0c;但是每个设备的运算能力和功能都不同&#xff0c;所以内核的设计上&#xff0c;采用了微内核的设计&#xff0c;除了最基础的功能放在内核…

mfc之tab标签控件的使用--附TabSheet源码

TabSheet源码 TabSheet.h #if !defined(AFX_TABSHEET_H__42EE262D_D15F_46D5_8F26_28FD049E99F4__INCLUDED_) #define AFX_TABSHEET_H__42EE262D_D15F_46D5_8F26_28FD049E99F4__INCLUDED_#if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // TabSheet.h : …

C++面向对象编程学习

C面向对象编程学习 前言一、C面向对象编程二、知识点学习1. 定义一个类1.1 使用struct定义1.2 使用class定义1.3 struct和class的区别 2. 类的定义方式2.1 单文件定义&#xff08;Inline Definition&#xff09;2.2 分离定义&#xff08;Separate Definition&#xff09;2.3 头…

[bug] vllm 0.6.1 RuntimeError: operator torchvision::nms does not exist

[bug] vllm 0.6.1 RuntimeError: operator torchvision::nms does not exist 环境 python 3.10 torch 2.4.0cu118 torchvision 0.19.0cu118 vllm 0.6.1.post2cu118问题详情 if torch._C._d…

【华为路由】OSPF多区域配置

网络拓扑 设备接口地址 设备 端口 IP地址 RTA Loopback 0 1.1.1.1/32 G0/0/0 10.1.1.1/24 RTB Loopback 0 2.2.2.2/32 G0/0/0 10.1.1.2/24 G0/0/1 10.1.2.1/24 RTC Loopback 0 3.3.3.3/32 G0/0/0 10.1.2.2/24 G0/0/1 10.1.3.1/24 RTD Loopback 0 4.4.4…

【Jenkins】解决在Jenkins Agent节点容器内无法访问物理机的docker和docker compose的问题

解决在Jenkins Agent节点容器内无法访问物理机的docker和docker compose的问题 1. 确定物理机docker和docker compose已经安装2. 编写Jenkins Agent结点docker-compose.yaml配置文件3. 修改docker运行时文件权限4. 启动容器并验证 最近接触到一个发布产物是一个 docker镜像的项…

【K8s】Kubernetes 证书管理工具 Cert-Manager

本文内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01; 如果对您有帮助&#xff0c;烦请点赞、关注、转发、订阅专栏&#xff01; 专栏订阅入口 | 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 | 往期精彩文章 【Docker】&#xff08;全…

Github优质项目推荐(第八期)

文章目录 Github优质项目推荐 - 第八期一、【manim】&#xff0c;66.5k stars - 创建数学动画的 Python 框架二、【siyuan】&#xff0c;19.5k stars - 个人知识管理软件三、 【GetQzonehistory】&#xff0c;1.3k stars - 获取QQ空间发布的历史说说四、【SecLists】&#xff0…