2013-03-17 13 views
11

Creando uno o più attendenti e attendibili, è possibile creare coroutine in C#?C# async, attende senza attività

Idealmente mi piacerebbe essere in grado di scrivere qualcosa di simile:

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

e quindi ottenere dal metodo Click qualcosa che posso neanche attendere all'interno di un altro metodo asincrono o che posso iterare in modo esplicito con alcuni MoveNext/Metodo GetResult.

L'obiettivo finale è che ho bisogno di integrare C# async/await con coroutines monadiche F # per un framework di sviluppo del gioco (http://casanova.codeplex.com).

risposta

7

Creando uno o più attendenti e attendibili, è possibile creare coroutine in C#?

Sicuro! Ho un blog post che utilizza TaskScheduler per creare semplici coroutine, e Jon Skeet ha un blog post che utilizza le funzioni attendibili personalizzate per creare semplici coroutine.

Ma guardando il resto della domanda e dei commenti, non sono sicuro che le coroutine siano ciò che realmente volete. Se si desidera "iterare" sugli attendibili, la soluzione migliore è Reactive Extensions (che interagisce bene con async). Non esiste una caratteristica del linguaggio C# per un "rendimento asincrono".

+0

Sì, sembra proprio questo. Ho solo bisogno di essere in grado di cedere all'interno di un asincrono e passare attraverso tutti i rendimenti risultanti da un ciclo esterno, ma non riesco a trovare informazioni su come farlo ... –

+1

'Task's non sono stati progettati per questo. Il team Rx ha iniziato a lavorare su un 'IAsyncEnumerator' che ha il comportamento che stai descrivendo (c'è un vecchio video Channel9 su di esso), ma quel lavoro è stato quasi abbandonato perché non è quasi mai l'approccio giusto. Vi consiglio invece di usare regolarmente Rx. –

+0

Aggiungendo la continuazione a un elenco globale di continuazioni che posso quindi rilassarmi all'interno di una personalizzazione attendibile, posso emulare ciò di cui ho bisogno. Sono ancora costretto a restituire un Task se voglio un metodo asincrono non vuoto, e questo sembra strano! –

Problemi correlati