C#等待函数返回yield break以继续

本文关键字:break 继续 yield 返回 等待 函数 | 更新日期: 2023-09-27 18:28:34

我在Unity工作,我有一个大脚本。在脚本中的某个时刻,将启动一个协同程序foo。我希望这个协程运行另一个IEnumerator函数bar,但我不希望bar作为协程启动。相反,我需要foo开始运行,可能会让步几次,调用bar,等待bar完成运行,然后继续运行。目前我不得不制作bar IEnumerable来做:

void Start () {
    StartCoroutine(foo());
}
IEnumerator foo () {
    //Do something up here
    foreach (int x in bar()) {
        yield return null; //Wait for bar to yield break
    }
    //Do more stuff down here
    yield break;
}

IEnumerable bar () {
    for (int x=0; x < 5; x++) {
        //Do Something 5 Times
        yield return x;
    }
    yield break;    
}

我一直在找,但找不到合适的方法。当然,这样的"bar"函数将超过10个,所以我不想每次调用一个函数时都要进行for循环。如何以这种方式调用其他IEnuerator函数?

C#等待函数返回yield break以继续

您要查找的是一种通常称为yield foreach的东西。这是一个不存在的功能(尽管经常被请求)。你不得不做你在这里做的事情。

当您编写迭代器块,并且希望单独生成其他IEnumerableIEnumerator的每个项时,您别无选择,只能显式枚举序列并生成每个项。如果你能写一些类似yield foreach Bar()的东西,那就太好了,但你做不到。您现有的解决方案是使用当前语言功能所能获得的最佳解决方案。

这样的东西怎么样:

class Program
{
    public class CoroutineThing
    {
        public IEnumerator foo()
        {
            //Do something up here
            var nTimesInvoked = 0;
            while (bar(nTimesInvoked++))
                yield return null; //Wait for bar to yield break
            //Do more stuff down here
            yield break;
        }
        bool bar(int nTimesInvoked)
        {
            if (nTimesInvoked < 5)
            {
                Console.WriteLine("Bar: {0}", nTimesInvoked);
                // Do something;
            }
            return nTimesInvoked < 4;
        }
    }
    public static void Main(params string[] args)
    {
        var cor = new CoroutineThing();
        var nFoo = 0;
        var e = cor.foo();
        while (e.MoveNext())
        {
            nFoo++;
            Console.WriteLine("{0} times foo", nFoo);
        }
        Console.ReadLine();
    }
}