2013-03-17 9 views
11

Durch Erstellen eines oder mehrerer Warter und Erwartungswerte, ist es möglich, in C# Coroutinen zu erstellen?C# async, warten ohne Tasks

Im Idealfall würde Ich mag Lage sein, etwas zu schreiben wie:

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

und dann aus der Click-Methode etwas zu erhalten, die ich entweder in einem anderen async Verfahren erwartet oder dass ich explizit mit einigen Movenext laufen kann/GetResult-Methode.

Das Endziel ist, dass ich C# async/await mit F # monadischen Coroutinen für ein Spielentwicklungsrahmenwerk integrieren muss (http://casanova.codeplex.com).

Antwort

7

Durch Erstellen eines oder mehrerer Warter und Erwartungswerte, ist es möglich, in C# Coroutinen zu erstellen?

Sicher! Ich habe eine blog post, die TaskScheduler verwendet, um einfache Koroutinen zu bauen, und Jon Skeet hat eine blog post, die benutzerdefinierte Wartezeit verwendet, um einfache Korutinen zu erstellen.

Aber mit Blick auf den Rest Ihrer Frage und Kommentare bin ich mir nicht sicher, ob Koroutinen das ist, was Sie wirklich wollen. Wenn Sie über die Erwartungswerte "iterieren" möchten, ist Ihre beste Wette Reactive Extensions (die gut mit async interagiert). Es gibt keine C# -Sprachenfunktion für eine "asynchrone Ausbeute".

+0

Ja, das sieht so aus. Ich muss nur in der Lage sein, in einem Async nachzugeben und alle resultierenden Renditen aus einer externen Schleife zu durchlaufen, aber ich kann keine Informationen darüber finden, wie man das macht ... –

+1

'Tasks' sind dafür nicht gedacht. Das Rx-Team hat mit der Arbeit an einem "IAsyncEnumerator" begonnen, der das von dir beschriebene Verhalten hat (es gibt ein altes Channel9-Video), aber diese Arbeit wurde fast aufgegeben, weil es fast nie der richtige Ansatz ist. Ich empfehle, stattdessen reguläres Rx zu verwenden. –

+0

Indem ich die Fortsetzung zu einer globalen Liste von Fortsetzungen hinzufüge, kann ich mich dann in einem Brauch entspannen, ich kann emulieren, was ich brauche. Ich bin immer noch gezwungen, eine Aufgabe zurückgeben, wenn ich eine non-void async-Methode möchte, und das scheint seltsam! –