c#:程序如何停止循环

本文关键字:何停止 循环 程序 | 更新日期: 2023-09-27 18:18:59

我想了解coroutine的概念,我不知道为什么代码在print 1,2,3时停止,但是在这个代码循环中应该运行30次并打印值1到30。

public class NewCore : MonoBehaviour
{
    void Start ()
    {
        StartCoroutine (MyCoroutine (0.52f));
        StartCoroutine (CoroutineKiller (2f));
    }
    IEnumerator MyCoroutine (float delay)
    {
        int value = 0;
        while (value < 30)
        {
            yield return new WaitForSeconds (delay);//wait
            value ++;
            print (value);
        }
        StartCoroutine (MyCoroutine (delay));
    }
    IEnumerator CoroutineKiller (float delay)
    {
        yield return new WaitForSeconds (delay);
        StopAllCoroutines ();
    }
}

c#:程序如何停止循环

您正在打印值从1 - 30延迟0.52秒,但2秒后你停止这样做(你叫StopAllCoroutines)。这就是为什么你只看到1、2和3被打印出来。

试着注释掉StartCoroutine (CoroutineKiller (2f));,或者给它更多的延迟,看看它是如何控制流停止的。


协程类似于线程——尽管不是真的——但在调用StartCoroutine不会阻塞代码的意义上是类似的。

所以当你这样做的时候:

void Start ()
{
    StartCoroutine (MyCoroutine (0.52f));
    StartCoroutine (CoroutineKiller (2f));
}

它实际上会启动两个协程,并在每次Update调用时一步一步并排执行它们。

如果您希望一个接一个地执行协程,请尝试以下操作:

void Start()
{
    StartCoroutine(F());
}
IEnumerator F()
{
    // by yielding the Coroutine, it will block the execution of
    // this coroutine (F) until MyCoroutine finishes
    yield return StartCoroutine(MyCoroutine(1.52f));
    // This is no longer doing much, really.
    yield return StartCoroutine(Killer(2f));
    print("done");
}

您可以阅读更多关于执行命令的信息,其中还包括协程和yield系统的实际工作方式。

似乎你使用StopCoroutine(MyCoroutine());在CoroutineKiller中,它在2秒后停止coroutine。(你的参数是2f。我记得你用过WaitForSeconds)。所以你的MyCoroutine函数只工作3个延迟(0.52 + 0.52 + 0.52 =1.56),在第四个延迟结束之前,你停止这个协程,你只得到1,2,3打印。