2013-03-17 31 views
11

Bằng cách tạo một hoặc nhiều chờ đợi và chờ đợi, có thể xây dựng coroutines trong C# không?C# không đồng bộ, đang chờ đợi mà không có nhiệm vụ

Lý tưởng nhất là tôi muốn để có thể viết một cái gì đó như:

void async Click() { 
    var mouse_position = await left_mouse_click(); 
    await shoot_projectile(); 
} 

và sau đó lấy từ Click phương pháp một cái gì đó mà tôi có thể một trong hai đang chờ đợi bên trong một phương pháp async hay mà tôi rõ ràng có thể lặp với một số MoveNext/Phương thức GetResult.

Mục tiêu cuối cùng là tôi cần tích hợp C# async/await với F # monodic coroutines cho khung phát triển trò chơi (http://casanova.codeplex.com).

Trả lời

7

Bằng cách tạo một hoặc nhiều người đang chờ đợi và chờ đợi, có thể xây dựng coroutines trong C# không?

Chắc chắn! Tôi có một blog post sử dụng TaskScheduler để xây dựng các coroutines đơn giản, và Jon Skeet có một blog post sử dụng các tùy chỉnh awaitables để xây dựng các coroutines đơn giản.

Nhưng nhìn vào phần còn lại của câu hỏi và nhận xét của bạn, tôi không chắc chắn nếu coroutines là những gì bạn thực sự muốn. Nếu bạn muốn "lặp lại" qua các khoản chờ, đặt cược tốt nhất của bạn là Reactive Extensions (tương tác tốt với async). Không có tính năng ngôn ngữ C# cho "lợi nhuận không đồng bộ".

+0

Vâng, có vẻ như vậy. Tôi chỉ cần có khả năng mang lại bên trong một async và bước qua tất cả các sản lượng thu được từ một vòng lặp bên ngoài, nhưng tôi không thể tìm thấy thông tin về cách thực hiện điều này ... –

+1

'Task's không được thiết kế cho điều đó. Nhóm Rx bắt đầu làm việc trên một 'IAsyncEnumerator' có hành vi bạn mô tả (có một video Channel9 cũ trên đó), nhưng công việc đó đã được tất cả nhưng bị bỏ rơi vì nó gần như không bao giờ là cách tiếp cận đúng. Tôi khuyên bạn nên sử dụng Rx thông thường thay thế. –

+0

Bằng cách thêm phần tiếp tục vào danh sách toàn cầu về các lần tiếp tục mà tôi có thể giải phóng bản thân mình bên trong một tùy chỉnh đang chờ đợi, tôi có thể mô phỏng những gì tôi cần. Tôi vẫn buộc phải trả lại một nhiệm vụ nếu tôi muốn một phương pháp không đồng bộ không có giá trị mặc dù, và điều đó có vẻ lạ! –

Các vấn đề liên quan