在下面的示例中,如何在运行DoLast()之前首先完成FinishFirst(),同时仍然保留'public void StartPage()'签名?
我试图避免让“StartPage()”返回一个IEnumerator,因为这会迫使我在界面中更改它。如果我的StartPage()接口支持IEnumerator和Void而不需要同时实现它们,那就太好了。
public void StartPage()
{
print("in StartPage()");
StartCoroutine(FinishFirst(5.0f));
DoLast();
print("done");
}
IEnumerator FinishFirst(float waitTime)
{
print("in FinishFirst");
yield return WaitForSeconds(waitTime);
print("leave FinishFirst");
}
void DoLast()
{
print("do after everything is finished");
}
答案 0 :(得分:0)
使用锁定对象应该有效:
object lockObject = new object();
public void StartPage()
{
print("in StartPage()");
StartCoroutine(FinishFirst(5.0f));
DoLast();
print("done");
}
IEnumerator FinishFirst(float waitTime)
{
lock(lockObject)
{
print("in FinishFirst");
yield return WaitForSeconds(waitTime);
print("leave FinishFirst");
}
}
void DoLast()
{
lock(lockObject)
{
print("do after everything is finished");
}
}
答案 1 :(得分:0)
我知道这是一个老问题,但如果我正确地理解了这个问题,那么这样的事情就行了。 DoLast()将在协同例程结束时运行。
IEnumerator FinishFirst(float waitTime)
{
print("in FinishFirst");
yield return WaitForSeconds(waitTime);
print("leave FinishFirst");
DoLast();
}
我在协同例程中使用了很多类似的代码来清理和终止例程,如果在运行该例程时创建另一个例程(主要用于文本可能随时更改的类型文本对话框)。