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

【Unity】协程的同步使用

1 前言

        协程一般是用于异步使用的,但有时候我们虽然使用了协程却希望其是同步执行的,所以这里就针对协程的同步使用来讨论一下。

2 同步使用

        可通过协程结束的回调函数来实现同步。如为每一个协程提供完成回调函数,以及创建一个bool变量(或只提供一个,协程一替一个用),bool = false,在协程开启后,变量用于协程开始语句的下方while循环中:while(!bool){yield return null},这些协程开启后就会在下方while中持续等待,之后再在协程的完成回调函数中修改bool值为ture,进而等待结束继续推进。单看一层协程其是同步的,实际若是嵌套协程,每层都使用这种方法,也可以保证整个嵌套协程是同步执行的。

        但这里实际是存在一个问题的,即第一个开启协程的函数通常不是协程函数,这样来看的话,最外层是没法进行等待的,因为协程并非真正的并行,若强行使用非协程式的死循环等待,那么整个程序就会卡死。这样来看,似乎只能实现所开启协程其内部逻辑的同步,开启协程后主逻辑还会继续往下走,无法保证主逻辑的同步。

        好在Unity的生命周期函数Start也是可以写成协程形式的,只需将void Start()改为IEnumerator Start()即可。这样最上层的协程函数就有了,我们可以在Start中开启协程,同时让Start本身同步执行,进而保证了主逻辑的同步执行。虽然多多少少有些局限性,但至少是一种解决方案。

        对用控制方法,那么除了上述的完成回调中调整变量值的方法外,还可以在每一层协程的完成回调函数中调用下一个协程,进而实现协程排序执行,只需在最内部的协程完成回调中控制一个变量值来让最外层主逻辑结束等待即可。但实际这种方式只能让嵌套协程按照顺序执行,一个完成才能执行下一个,而前一个方法可以让子协程在自身的任何位置执行并保证同步,所以此方法虽然简单但有局限性,根据需求选择即可。

例子:

//方法一(嵌套就不演示了)
IEnumerator Start()
{bool isFinish = false;this.StartCoroutine(A.FF_Init(() => //完成回调{isFinish = true;}));while (!isFinish)                   //等待{yield return null;}isFinish = false;this.StartCoroutine(B.FF_Init(() =>{isFinish = true;}));while (!isFinish){yield return null;}
}//方法二
IEnumerator Start()
{bool isFinish = false;this.StartCoroutine(A.FF_Init(() =>//完成回调{this.StartCoroutine(B.FF_Init(() =>{isFinish = true;}));}));//等待while (!isFinish)                   {yield return null;}
}

   3 后记

        暂时这么多吧。

http://www.xdnf.cn/news/425287.html

相关文章:

  • 第六天 车载应用开发
  • 【速通RAG实战:进阶】10.RAG 进化论:Advanced与Modular架构解锁智能问答新维度
  • 激光雷达定位算法在FPGA中的实现——section3 Matlab实现和校验
  • HarmonyOS 【诗韵悠然】AI古诗词赏析APP开发实战从零到一系列(一、开篇,项目介绍)
  • 【LeetCode 热题 100】二叉树的最大深度 / 翻转二叉树 / 二叉树的直径 / 验证二叉搜索树
  • React vs Vue:点击外部事件处理的对比与实现
  • 用vite脚手架建立 前端工程
  • 服务器制造业中,L2、L6、L10等表示什么意思
  • Shell脚本实践(修改文件,修改配置文件,执行jar包)
  • 互联网大厂Java求职面试:优惠券服务架构设计与AI增强实践-4
  • R²AIN SUITE 如何破解制造业效率难题,制造业效率提升新思路​
  • 配置Hadoop集群-上传文件
  • python_竞态条件
  • Gemini 2.5 推动视频理解进入新时代
  • 多模态大语言模型arxiv论文略读(七十三)
  • 二维差分(主要看原数组与差分数组的关系)
  • python: union()函数用法
  • 解决 MinIO 对象存储“AccessDenied”问题及 Docker 操作全解析
  • 《Docker 入门与进阶:架构剖析、隔离原理及安装实操》
  • 【认知思维】沉没成本谬误:为何难以放弃已投入的资源
  • jenkins流水线常规配置教程!
  • libMemcached 库下载记录
  • SQL 中 INSTR 函数简介及 截取地址应用
  • 【python】—conda新建python3.11的环境报错
  • 第五十七篇 Java接口设计之道:从咖啡机到智能家居的编程哲学
  • 本地部署ollama及deepseek(linux版)
  • ssl 中 key 和pem 和crt是什么关系
  • 配置 Spark 以 YARN 模式
  • 笔试模拟 day9
  • 深入理解Java编写泛型的方法!