【问题标题】:Hold or Wait while Coroutine finishes协程完成时保持或等待
【发布时间】:2012-04-01 15:26:52
【问题描述】:


在下面的示例中,如何在运行 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");
}

【问题讨论】:

  • 我不相信默认情况下允许 System.Threading.Tasks,并且在尝试使用 BeginInvoke Unity 时似乎找不到 IAsyncResult 的定义...
  • 请不要在标题前加上“C# / Unity :”等。这就是标签的用途。

标签: c# unity3d coroutine


【解决方案1】:

使用锁对象应该可以工作:

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

【讨论】:

  • lock-object 似乎没有等待协程完成,不过谢谢...我学到了一个新关键字! ;-)
  • 好的,所以你也需要睡一会儿,这样 FinishFirst 就有机会锁定对象。
  • lock() 是使用信号量的简化。在帮助中阅读如何在主循环中设置锁定并在 FinishFirst 中清除它。然后你就可以等待锁定。
  • 谢谢 Mattias,抱歉周末不在。例如,我需要输入“System.Threading.Thread.Sleep(5000);”在 FinishFirst() 方法中的“lock(lockObject)”之后正确吗?您能否指出该信息在 Unity 帮助中的位置?谢谢。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多