C#协程(Coroutine)

1.什么是协程

协程Coroutine)是一种轻量级的并发执行方式,它允许程序在执行过程中暂停并恢复,而无需操作系统介入。‌协程的执行过程更类似于子例程,或者说不带返回值的函数调用。协程完全由程序所控制(在用户态执行),避免了内核态和用户态的切换开销,提高了执行效率

2.协程的应用场景

协程在IO密集型任务中表现尤为出色,能够在IO等待时间切换执行其他任务,从而大大节省资源并提供性能。然而,对于计算密集型任务,协程的来回切换可能会降低性能。

3.如何开启协程

void Start()
{
    StartCoroutine("IEnumerable_1");//开启最基本的协程

    StartCoroutine("IE_WaitForSeconds");//开启一个等待的协程

    StartCoroutine("IE_WaitForFixedUpdate");//开启一个等待FixedUpdate的协程

    StartCoroutine("IE_WaitForEndOfFrame");//开启渲染协程

    StartCoroutine("IE_Test");//开启协程的嵌套
    
    StartCoroutine("IE_StopIE");//测试停止协程

    StartCoroutine("IE_Time");//开启倒计时的协程
}

IEnumerator IEnumerable_1()
{

    yield return null;

    Debug.Log("最基本的协程 调用了");
}

IEnumerator IE_WaitForSeconds()
{
    yield return new WaitForSeconds(5f);
    Debug.Log("等待了五秒");
}

//等待FixedUpdate执行完执行
IEnumerator IE_WaitForFixedUpdate()
{
    yield return new WaitForFixedUpdate();
    Debug.Log("等待FixedUpdate执行完执行");
}

private void FixedUpdate()
{
    //Debug.Log("FixedUpdate");//配合第三点测试用的
}

//协程 等待渲染完毕调用
IEnumerator IE_WaitForEndOfFrame()
{
    yield return new WaitForEndOfFrame();
    Debug.Log("等待渲染完毕");
}

//协程执行完 执行另一个协程
IEnumerator IE_Test()
{
    yield return StartCoroutine("IE_Test2");
    Debug.Log("开启了Test2协程");
}

IEnumerator IE_Test2()
    {
        yield return null;
        Debug.Log("执行完Test2协程");
    }

//停止一个协程
IEnumerator IE_StopIE()
{
    int num = 0;
     while (num < 10000)
       {
         num += 1;
         Debug.Log(num);//打印小于10000的数字
         yield return null;
       }
}

//使用协程做一个倒计时
IEnumerator IE_Time()
{
  int num = 60;
   while (num > 0)
     {
        num -= 1;
        yield return new WaitForSeconds(1f);
        Debug.Log(num);
     }
}

void Update()
 {
    Debug.Log("Update");//配合 第一点 测试

    //按下空格 停止这个协程
    if (Input.GetKeyDown(KeyCode.Space))
    {
       StopCoroutine("IE_StopIE");
    }
}

4.协程与进程、线程的区别:

  • 进程‌:操作系统级别的执行单元,拥有独立的地址空间和系统资源。
  • 线程‌:进程内的执行单元,共享进程的资源,但有独立的执行流。
  • 协程‌:比线程更轻量级的执行单元,完全由程序控制,切换代价小,适用于高并发场景,特别是在IO多路复用中的应用。

5.协程的工作原理

协程在遇到IO阻塞时不会阻塞整个进程,且不需要加锁机制,简化了同步问题。协程的切换是在线程内完成的,涉及的资源较少,切换代价较小。协程本身是非常轻巧的,可以简单理解为只是切换寄存器和协程栈的内容。

### C# 协程的概念及其实现 #### 什么是协程协程Coroutine)是一种轻量级的并发执行机制,允许程序在运行过程中暂停并恢复其状态。与传统的线程不同,协程不需要操作系统的支持即可实现上下文切换,因此具有更高的性能和更低的资源消耗[^4]。 #### C# 中的协程实现 C#协程通常通过 `IEnumerator` 接口以及 `yield return` 和 `yield break` 关键字来实现。以下是具体的工作原理: 1. **`IEnumerator` 接口** 在 C# 中,协程的核心是由实现了 `IEnumerator` 或 `IEnumerable` 接口的对象驱动的。当一个方法返回 `IEnumerator` 类型时,该方法实际上是一个迭代器,可以通过逐次调用 `MoveNext()` 方法逐步执行代码块[^2]。 2. **`yield return` 的作用** 使用 `yield return` 可以让当前方法在一个特定位置暂停,并保存当前的状态。当下一次调用 `MoveNext()` 时,方法会从上次暂停的位置继续执行,而不是重新开始整个方法。 3. **启动协程的方式** 在 Unity 中,协程通常是通过 `StartCoroutine` 方法启动的。这个方法接受一个 `IEnumerator` 对象作为参数,并负责管理它的生命周期[^3]。 #### 示例代码 以下是一个简单的 C# 协程示例,展示了如何使用 `yield return` 来创建和控制协程的行为: ```csharp using System.Collections; using UnityEngine; public class CoroutineExample : MonoBehaviour { void Start() { StartCoroutine(MyCoroutine()); } IEnumerator MyCoroutine() { Debug.Log("Step 1"); yield return new WaitForSeconds(1); // 暂停一秒 Debug.Log("Step 2"); yield return null; // 等待一帧 Debug.Log("Step 3"); } } ``` 在这个例子中: - 当协程到达 `yield return new WaitForSeconds(1)` 时,它会暂停执行直到指定的时间过去。 - 到达 `yield return null` 时,则会在下一帧继续执行。 #### 底层原理分析 C# 协程的本质在于编译器会对带有 `yield return` 的方法进行特殊处理。编译后的代码会被转换成一个内部类,其中包含了所有的局部变量和状态信息。每次调用 `MoveNext()` 时,都会更新这些状态并决定下一步的操作。 此外,在 Unity 中,协程的调度依赖于游戏循环框架。每当协程遇到 `yield return` 语句时,Unity 就会将其挂起并将控制权交还给主线程,等待条件满足后再恢复执行。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值