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


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, используют его, но в документации совершенно ничего не говорится о создании пользовательских операций, обертке существующих сопрограмм и т. Д.

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


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

Ответы:



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.