如何等待异步操作/协程?


11

我正在寻找一种通用/可重用的方法来等待协程和异步操作在Unity 5中完成,类​​似于C#5的await关键字。

我能想到的最简单的方法是这样的:

 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 '16

Answers:



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.