2013-03-17 8 views
11

awaitersとawaitablesを1つ以上作成すると、C#でコルーチンを構築できますか?C#async、タスクなしでお待ちください

理想的には私のようなもの書くことができるようにしたいと思います:

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

をして、Clickメソッドから、私は別の非同期メソッドの内部または私は明示的に/いくつかのMoveNextメソッドを反復処理できることをどちらか待つことができる何かを取得しますGetResultメソッド。

最終目標は、ゲーム開発フレームワーク(http://casanova.codeplex.com)のために、C#async/awaitとF#モナドコルーチンを統合する必要があることです。

答えて

7

awaitersとawaitablesを1つ以上作成すると、C#でコルーチンを構築できますか?

確かに!私はblog postTaskSchedulerを使って単純なコルーチンを作成し、Jon Skeetには簡単なコルーチンを構築するためのカスタム待ち時間を使用するblog postがあります。

あなたの質問とコメントの残りの部分を見て、コルーチンが本当に必要なものかどうかはわかりません。待ち時間を「繰り返し」する場合は、Reactive Extensions(これはasyncとよく相互運用します)です。 "async yield"のC#言語機能はありません。

+0

はい、そのように見えます。私はちょうど非同期内部で降伏できるようにする必要があり、結果として得られるすべての歩留まりを外部ループから踏み出す必要がありますが、これを行う方法に関する情報は見つかりませんでした。 –

+1

'Task'sはそのために設計されていません。 Rxチームは、あなたが記述している動作(古いChannel9ビデオがあります)を持つ 'IAsyncEnumerator'の作業を開始しましたが、そのアプローチは決して適切なアプローチではないため放棄されました。代わりに正規のRxを使用することをお勧めします。 –

+0

継続性のグローバルリストに継続を追加することで、私は自分自身を待っているカスタムの中で自分自身を巻き戻すことができ、私は必要なものをエミュレートすることができます。私は空の非同期メソッドが必要な場合でも、タスクを返すように強制されています。 –

関連する問題