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

时间:2013-08-21 17:29:56

标签: c# unity3d yield

我在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;    
}

我一直在寻找,但我无法找到正确的方法。当然会有超过10个这样的&#34; bar&#34;函数,所以我不想每次想要调用一个for循环。如何以这种方式调用其他IEnuerator函数?

2 个答案:

答案 0 :(得分:1)

您正在寻找的是经常被称为yield foreach的东西。这是一个不存在的功能(尽管经常被要求)。你几乎被迫完成你在这里做的事情。

当您编写迭代器块并且希望单独生成其他IEnumerableIEnumerator的每个项目时,您别无选择,只能明确枚举序列并生成每个项目。如果你能写出像yield foreach Bar()这样的东西,那就太好了。您现有的解决方案与使用当前语言功能一样好。

答案 1 :(得分:0)

这样的事情怎么样:

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();
    }
}