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?


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:



Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.