Làm thế nào để chờ đợi các hoạt động / coroutines async?


11

Tôi đang tìm kiếm một cách chung / có thể sử dụng lại để chờ coroutines và các hoạt động không đồng bộ kết thúc trong Unity 5, tương tự như awaittừ khóa của C # 5 .

Cách đơn giản nhất tôi có thể nghĩ là một cái gì đó như thế này:

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

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

và sau đó trong một coroutine khác:

 while(!someUtilityInstance.IsDoingSomething)
     yield return null;

Tuy nhiên, điều này không hay lắm vì nó mã hóa các whilecâu lệnh, không thể sử dụng lại được (cần các thể hiện và các lớp chuyên dụng ngay cả đối với các hàm tiện ích đơn giản!) Và rất nhiều công cụ đơn lẻ hoặc tĩnh mà thậm chí không cần thiết.

Gần nhất tôi tìm thấy là sử dụng Unity's AsyncOperation. Điều này ở đây hoạt động rất độc đáo:

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

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

Tuy nhiên .. vấn đề là: Làm thế nào để tạo ra một AsyncOperation? Một vài dịch vụ, ví dụ như SceneManagerđang sử dụng nó, nhưng tài liệu hoàn toàn không có bất cứ điều gì về việc tạo các hoạt động tùy chỉnh hoặc gói các coroutines hiện có, v.v.

Vì vậy, có cách nào để tạo ra một "sự chờ đợi" đơn giản, chung chung và có thể giải quyết được cho các coroutines tùy chỉnh không?


Có lẽ sử dụng phản xạ và gọi lại? Truyền hai phương pháp vào một coroutines. Cách đầu tiên để làm. Sử dụng sự phản chiếu để xem khi nào nó kết thúc, sau đó gọi cái thứ hai
Evorlor

Câu trả lời:



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.