Как ждать асинхронных операций / сопрограмм?

11

Я ищу универсальный / повторно используемый способ ожидания завершения сопрограмм и асинхронных операций в Unity 5, аналогично awaitключевому слову C # 5 .

Самый простой способ, который я могу придумать, это что-то вроде этого:

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

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

а потом в другом сопрограмме

 while(!someUtilityInstance.IsDoingSomething)
     yield return null;

Однако это не очень хорошо, потому что это загромождает код с whileоператорами, не может использоваться повторно (нужны экземпляры и выделенные классы даже для простых служебных функций!) И много одиночных или статических вещей, где это даже не нужно.

Самое близкое, что я нашел, это использование Unity AsyncOperation. Это здесь работает очень хорошо:

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

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

Однако проблема заключается в следующем: как создать AsyncOperation? Некоторые сервисы, например SceneManager, используют его, но в документации совершенно ничего не говорится о создании пользовательских операций, обертке существующих сопрограмм и т. Д.

Итак, есть ли способ создать простое, универсальное и пригодное для повторения «ожидание» для пользовательских сопрограмм?

artganify
источник
Возможно использовать рефлексию и обратные вызовы? Передайте два метода в сопрограммы. Первый способ сделать. Используйте отражение, чтобы увидеть, когда оно закончится, а затем назовите второе
Evorlor

Ответы:

2
yield return StartCoroutine(yourIEnumatorMethod());

Будет ждать, пока ваш метод не завершится, единственное неудобство с этим решением - оно заставляет вас делать этот вызов внутри IEnumatorметода.

См. Http://docs.unity3d.com/ScriptReference/Coroutine.html.

Томас ЛОРЕНТ
источник
1

С Unity 2017 вы теперь можете использовать async await в качестве альтернативы сопрограммам, как описано здесь

Стив Вермейлен
источник