协程是怎么实现的,如何用纯C#怎么实现协程,携程和线程的区别

这篇具有很好参考价值的文章主要介绍了协程是怎么实现的,如何用纯C#怎么实现协程,携程和线程的区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

携程

协程(Coroutine)是一种特殊的函数,可以暂停执行并在稍后恢复执行。在Unity中,协程通常用于实现一些异步操作,如等待一段时间后再执行某个操作,或者分步执行一个复杂的操作。

在Unity中,协程可以使用C#的yield关键字来实现。yield语句可以暂停协程的执行,并在稍后恢复执行。以下是一个简单的协程示例:

using System.Collections;
using UnityEngine;

public class CoroutineExample : MonoBehaviour
{
    private void Start()
    {
        StartCoroutine(MyCoroutine());
    }

    private IEnumerator MyCoroutine()
    {
        Debug.Log("协程开始执行");
        yield return new WaitForSeconds(1.0f);
        Debug.Log("等待了1秒钟");
        yield return new WaitForSeconds(2.0f);
        Debug.Log("又等待了2秒钟");
        yield return null;
        Debug.Log("协程执行完毕");
    }
}

在上面的代码中,MyCoroutine()方法是一个协程,使用StartCoroutine()方法来启动协程的执行。在MyCoroutine()方法中,使用yield return语句来暂停协程的执行。通过yield return new WaitForSeconds()语句可以等待一段时间,而yield return null语句表示暂停协程的执行但不进行等待,等待时间可以通过帧率来控制。

除了使用yield语句来实现协程外,也可以使用纯C#来实现协程。一种常见的方式是使用迭代器(Iterator)和状态机(StateMachine)来实现协程。以下是一个使用纯C#实现的协程示例:

using System;
using System.Collections.Generic;

public class CoroutineExample
{
    private IEnumerator<object> coroutine;
    private bool paused;

    public CoroutineExample(IEnumerator<object> coroutine)
    {
        this.coroutine = coroutine;
        this.paused = false;
    }

    public void Start()
    {
        this.paused = false;
        this.Resume();
    }

    public void Stop()
    {
        this.paused = true;
    }

    public void Resume()
    {
        while (!this.paused && this.coroutine.MoveNext())
        {
            object yielded = this.coroutine.Current;
            if (yielded is IEnumerator<object>)
            {
                this.coroutine = (IEnumerator<object>)yielded;
            }
            else if (yielded is WaitForSeconds)
            {
                WaitForSeconds delay = (WaitForSeconds)yielded;
                DateTime resumeTime = DateTime.UtcNow.AddSeconds(delay.Seconds);
                while (DateTime.UtcNow < resumeTime)
                {
                    // Wait for the specified time
                }
            }
        }
    }

    private class WaitForSeconds
    {
        public float Seconds { get; set; }

        public WaitForSeconds(float seconds)
        {
            this.Seconds = seconds;
        }
    }
}

在上面的代码中,CoroutineExample类是一个协程管理器,通过Start()方法来启动协程的执行,通过Stop()方法来停止协程的执行,通过Resume()方法来恢复协程的执行。协程的代码则是以IEnumerator<object>接口的形式传递给CoroutineExample类的构造函数中的coroutine参数。在Resume()方法中,使用while循环来遍历协程中的yield语句,如果协程被暂停或已经执行完毕,则跳出循环。对于每个yield语句,使用coroutine.Current属性来获取yield语句的返回值,并根据返回值的类型进行相应的处理。如果返回值是IEnumerator<object>类型,则将协程的执行转移到新的迭代器中;如果返回值是WaitForSeconds类型,则通过等待指定时间的方式来暂停协程的执行。

上面的纯C#协程实现方式比较简单,但是不支持Unity的协程特性,例如可以通过yield return new WaitForEndOfFrame()语句来等待渲染帧结束后再执行下一帧操作。因此,在Unity中,还是建议使用yield语句来实现协程。

携程和线程的区别

Unity协程和线程都可以在程序中实现多任务的处理,但它们的实现机制和使用方式有所不同。

协程是一种轻量级的线程,可以在单个线程内实现多个任务之间的切换,而无需创建多个线程。在Unity中,协程是通过yield return语句来实现的,它可以在等待某些操作完成期间暂停当前函数的执行,并在下一帧或者一段时间之后继续执行。

线程是程序中独立的执行流,可以在程序中同时运行多个任务。线程通常需要在程序中显式地创建和销毁,并且需要进行同步和互斥操作来避免数据竞争和死锁等问题。在Unity中,如果需要进行耗时的计算或者需要执行阻塞操作(如网络请求、文件读写等),可以使用线程来处理这些操作,避免卡死主线程。

总的来说,协程适用于需要在Unity主线程中执行的任务,例如动画、延迟等待、定时任务等,而线程则适用于需要执行耗时操作的任务,例如计算、网络请求、文件读写等。文章来源地址https://www.toymoban.com/news/detail-763840.html

到了这里,关于协程是怎么实现的,如何用纯C#怎么实现协程,携程和线程的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 操作系统进程线程(一)—进程线程协程区别、多进程多线程、进程调度算法、进程线程通信

    定义上 进程: 资源分配和拥有 的基本单位,是调度的基本单位。 运行一个可执行程序会创建一个或者多个进程;进程就是运行起来的程序 线程:程序 执行 基本单位,轻量级进程。 每个进程中都有唯一的主线程 ,主线程和进程是相互依赖的关系。 协程: 用户态 的轻量级

    2024年02月01日
    浏览(57)
  • 携程总监的单元测试是怎么样写的?

      大家都知道,开发软件的时候为代码编写单元测试是很好的。但实际上,光有测试还不够,还要编写好的测试,这同样重要。 要做到这一点,考虑遵循一些固执的原则,对测试代码给予一些关爱: 要做到这一点,应该要进行毫不留情的重构,就像对生产代码应该做的那样

    2024年02月03日
    浏览(43)
  • 携程大牛的单元测试是怎么样写的?

    大家都知道,开发软件的时候为代码编写 单元测试 是很好的。但实际上,光有测试还不够,还要编写好的测试,这同样重要。 要做到这一点,考虑遵循一些固执的原则,对测试代码给予一些关爱: 1. 保持测试代码的紧凑和可读性 要做到这一点,应该要进行毫不留情的重构

    2024年04月12日
    浏览(41)
  • python正则+多线程(代理)+线程池+协程

    常用元字符 . 匹配除换行符以外的任意字符 w 匹配字幕或数字或下划线 s 匹配任意空白字符 d 匹配数字 n 匹配一个换行符 t 匹配一个制表符 W 匹配非字母或数字或下划线 D 匹配非数字 S 匹配非空白符 a|b 匹配字符a或b () 匹配括号内的表达式,也表示一个组 […] 匹配字符

    2024年02月16日
    浏览(45)
  • 什么是进程、线程、协程

    我们都知道计算机的核心是CPU,它承担了所有的计算任务;而操作系统是计算机的管理者,它负责任务的调度、资源的分配和管理,统领整个计算机硬件;应用程序则是具有某种功能的程序,程序是运行于操作系统之上的。 进程是一个具有一定独立功能的程序在一个数据集上

    2024年02月13日
    浏览(37)
  • 进程,线程,协程

    1、进程 进程是具有一定独立功能的程序关于某个​​数据集​​合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销

    2024年02月11日
    浏览(46)
  • 【Python】多线程编程 ① ( 线程相关概念 | 进程 | 线程 | 协程 / 纤程 | 管程 )

    进程 与 操作系统 : 进程 是 操作系统 中 能够独立运行的单元 , 是 操作系统 对 正在运行的 应用程序 的 抽象结构 描述 ; 操作系统 中 运行的每个 应用程序 就是一个进程 ; 一个操作系统中可以运行 多个 进程 ; 每个 应用程序 都会被 操作系统 分配一个 进程 ID ; 多个进程之间

    2024年02月15日
    浏览(38)
  • 【Java 并发编程】一文读懂线程、协程、守护线程

    在 Java 线程的生命周期一文中提到了 就绪状态的线程在获得 CPU 时间片后变为运行中状态 ,否则就会在 可运行状态 或者 阻塞状态 ,那么系统是如何分配线程时间片以及实现线程的调度的呢?下面我们就来讲讲线程的调度策略。 线程调度是指系统为线程分配 CPU 执行时间片

    2023年04月08日
    浏览(60)
  • Unity多线程和协程

    Unity支持多线程的使用,可以使用C#的Thread类来创建和管理线程,只需要引入这个类: 但需要注意的是,在Unity中,只有主线程(也称为渲染线程)可以访问Unity对象,如GameObject、Transform等,如果在其他线程中访问这些对象,会导致不可预期的结果。 因此,在使用多线程时,

    2024年02月16日
    浏览(43)
  • C#编程-实现多线程

    多线程帮助同时执行各种操作。这为用户节省时间。多线程程序包括一个主线程和其他用户定义的线程以同时执行多个任务。 微处理器为执行的进程分配内存。每个进程占有内存中它们自己的地址空间。但是,所有在进程中的线程占有相同的地址空间。多线程允许在一个程序

    2024年02月02日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包