2012-03-16 12 views
1


以下の例では、DoLast()を実行する前にFinishFirst()を最初に完了させ、 'public void StartPage()'の署名は保持しますか?Coroutineが終了するまで待機または待機する


私はインターフェイスでそれを変更するために私を強制するよう「スタートページは、()」のIEnumeratorを返すことを避けるためにしようとしています。 StartPage()用の私のInterfaceが両方を実装する必要なしに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

私はSystem.Threading.Tasksがデフォルトで許可されているとは思わないし、BeginInvoke Unityを使用しようとするとIAsyncResultの定義が見つからないようだ... – user1229895

+0

タイトルに "C#/ Unity: "など。それがタグのためのものです。 –

答えて

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

コルーチンが終了している間、ロックオブジェクトが待たされていないようですが、おかげさまで...私は新しいキーワードを学びました! ;-) – user1229895

+0

さて、少しでも寝る必要があるので、FinishFirstはオブジェクトをロックする機会を得ます。 –

+0

lock()はセマフォを使用した単純化です。メインループでロックを設定し、代わりにFinishFirstでロックを解除する方法については、ヘルプをお読みください。それでは、ロックを待つだけです。 –

0

私は、これは古い質問ですけど、私が正しく質問を理解すれば、このようなものは動作します。 DoLast()はコルーチンの最後に実行されます。私はこの1つは、任意の時点で主にテキストが変更される可能性があります入力されたテキストダイアログボックスの(動作しているときに、別の1が作成された場合は、ルーチンをきれいにし、殺すためにコルーチンの内側に類似した多くのコードを使用し

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

)。

関連する問題