Jak czekać na operacje asynchroniczne / coroutines?

11

Szukam ogólnego / wielokrotnego użytku sposobu oczekiwania na zakończenie operacji asynchronicznych w Unity 5, podobnie jak w przypadku awaitsłowa kluczowego C # 5 .

Najprostszym sposobem, w jaki mogę myśleć, jest coś takiego:

 public class SomeUtility {
     public bool IsDoingSomething { get; private set; }

     public IEnumerator DoSomethingAsync() {
         IsDoingSomething = true;
         yield return new WaitForSeconds(2);
         IsDoingSomething = false;
     }
 }

a następnie w innej coroutine:

 while(!someUtilityInstance.IsDoingSomething)
     yield return null;

Nie jest to jednak bardzo miłe, ponieważ zaśmieca kod whileinstrukcjami, nie nadaje się do ponownego użycia (potrzebuje instancji i dedykowanych klas nawet dla prostych funkcji narzędziowych!) I wielu singletonów lub statycznych rzeczy, w których nawet nie jest to potrzebne.

Najbliższe, jakie znalazłem, to używanie Unity's AsyncOperation. To działa bardzo ładnie:

public static IEnumerator Await(this AsyncOperation operation) {
    while(!operation.isDone)
        yield return operation;
}

yield return SceneManager.LoadLevelAsync("blaaaah").Await();

Jednak .. problemem jest: Jak utworzyć AsyncOperation? Na przykład SceneManagerkorzysta z niego kilka usług, ale w dokumentacji całkowicie brakuje niczego w tworzeniu niestandardowych operacji lub pakowaniu istniejących korporacji itp.

Czy jest więc sposób na stworzenie prostego, ogólnego i możliwego do zastąpienia „czekania” na niestandardowe coroutines?

artganify
źródło
Być może użyj refleksji i oddzwaniania? Przekaż dwie metody do coroutines. Pierwsza metoda do zrobienia. Użyj refleksji, aby zobaczyć, kiedy się skończy, a następnie zadzwoń do drugiego
Evorlor

Odpowiedzi:

1

Dzięki Unity 2017 możesz teraz używać asynchronicznego oczekiwania jako alternatywy dla coroutines, jak opisano tutaj

Steve Vermeulen
źródło