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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值