Como aguardar operações assíncronas / corotinas?

11

Estou procurando uma maneira genérica / reutilizável de aguardar a conclusão de operações de corotinas e assíncronas no Unity 5, semelhante à awaitpalavra-chave do C # 5 .

A maneira mais simples de pensar é algo como isto:

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

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

e depois em outra corotina:

 while(!someUtilityInstance.IsDoingSomething)
     yield return null;

No entanto, isso não é muito bom, porque confunde o código com whileinstruções, não é reutilizável (precisa de instâncias e classes dedicadas, mesmo para funções utilitárias simples!) E muitas coisas singleton ou estática, onde nem é necessário.

O mais próximo que encontrei foi o uso do Unity AsyncOperation. Isso aqui funciona muito bem:

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

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

No entanto .. o problema é: Como criar um AsyncOperation? Alguns serviços, por exemplo, SceneManagerestão sendo usados, mas a documentação carece completamente de algo sobre a criação de operações personalizadas ou sobreposição de corotinas existentes etc.

Então, existe uma maneira de criar um "aguardar" simples, genérico e resuable para corotinas personalizadas?

artganify
fonte
Talvez use reflexão e retornos de chamada? Passe dois métodos em uma corotina. O primeiro o método a ser feito. Use reflexão para ver quando ele terminar, em seguida, chamar o segundo
Evorlor

Respostas:

2
yield return StartCoroutine(yourIEnumatorMethod());

Esperará até que seu método seja concluído, o único inconveniente dessa solução é que o força a fazer essa chamada dentro de um IEnumatormétodo.

Consulte http://docs.unity3d.com/ScriptReference/Coroutine.html

Thomas LAURENT
fonte
1

Com o Unity 2017, agora você pode usar o Async Aguardar como uma alternativa às corotinas, conforme descrito aqui

Steve Vermeulen
fonte