C# 在协同程序完成时保持或等待

C# 在协同程序完成时保持或等待,c#,unity3d,coroutine,C#,Unity3d,Coroutine,在下面的示例中,如何让FinishFirst()在运行DoLast()之前先完成,同时仍保留“public void StartPage()”签名 我试图避免让“StartPage()”返回IEnumerator,因为这会迫使我在接口中更改它。如果我的StartPage()接口同时支持IEnumerator和Void,而不需要实现这两个功能,那就太好了 public void StartPage() { print("in StartPage()"); StartCorouti


在下面的示例中,如何让FinishFirst()在运行DoLast()之前先完成,同时仍保留“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");
}

使用锁定对象应该可以:

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

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

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

如果在co例程运行时创建了另一个例程(主要用于文本可能随时更改的键入文本对话框),我会在co例程中使用大量类似的代码来清除和终止该例程。

我不相信默认情况下允许System.Threading.Tasks,在尝试使用BeginInvoke时,Unity似乎找不到IAsyncResult的定义……请不要在标题前加上“C#/Unity:”之类的前缀。这就是标记的用途。锁对象似乎没有等到协同程序完成,谢谢……我学会了一个新的关键字!;-)好的,你也需要睡一会儿,FinishFirst有机会锁定这个对象。lock()是使用信号量的简化。请阅读帮助,了解如何在主循环中设置锁,并在FinishFirst中清除锁。那你就等着锁吧谢谢Mattias抱歉周末不在家。例如,我需要在FinishFirst()方法中的“lock(lockObject)”之后加上“System.Threading.Thread.Sleep(5000)”,对吗?你能告诉我这些信息在Unity help中的位置吗?非常感谢。