在协程完成时保持或等待

问题描述 投票:0回答:2


在下面的示例中,如何在运行 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");
}
c# unity3d coroutine
2个回答
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");
    }
}

0
投票

我知道这是一个老问题,但如果我正确理解了这个问题,那么这样的事情就可以了。 DoLast() 将在协程结束时运行。

IEnumerator FinishFirst(float waitTime)
{
    print("in FinishFirst");        
    yield return WaitForSeconds(waitTime);
    print("leave FinishFirst");
    DoLast();
}  

我在协同例程中使用了很多类似的代码来清理和终止这个例程,如果在这个例程运行时创建了另一个例程(主要用于文本可能随时更改的键入文本对话框)。

© www.soinside.com 2019 - 2024. All rights reserved.