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
函数?
您要查找的是一种通常称为yield foreach
的东西。这是一个不存在的功能(尽管经常被请求)。你不得不做你在这里做的事情。
当您编写迭代器块,并且希望单独生成其他IEnumerable
或IEnumerator
的每个项时,您别无选择,只能显式枚举序列并生成每个项。如果你能写一些类似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();
}
}