Verwenden von async-await auf .net 4

137

Ich beginne derzeit mit der Erstellung einer Anwendung, die von der asynchronen Wartefunktion von C # 5 sehr profitieren würde. Ich bin mir jedoch nicht sicher, welche Version von VS und der asynchronen Laufzeit verwendet werden soll.

Wenn ich mir die Beliebtheitstabellen des Betriebssystems anschaue, muss ich Windows XP noch etwa drei Jahre lang unterstützen. Es sieht so aus, als ob .net 4.5 nur unter neueren Windows-Versionen ausgeführt wird, daher muss ich auf .net 4.0 abzielen. Die Entwicklungsmaschinen verwenden Windows 7, daher ist die Verwendung einer neueren Version von VS kein Problem.

Jetzt muss ich zuerst einen Compiler auswählen, um dies zu tun:

  • VS2010 mit AsyncCTP
  • VS2012-Vorschau (und endgültig, sobald sie eintrifft), wobei das Ziel auf .net 4.0 festgelegt wird
  • Mono (Sieht so aus, als hätte 2.12 asynchrones Warten, ich bevorzuge / bin es gewohnt, VS gegenüber MonoDevelop als IDE zu verwenden)

Welches hat weniger Code-Gen-Fehler? Wenn Sie sich Jon Skeets Blog ansehen, verwendet die VS2012-Vorschau einen Never-Code-Generator als das CTP.

Und was noch wichtiger ist, welche Laufzeit soll verwendet werden?

Enthält VS2012 eine weiterverteilbare asynchrone Laufzeit zur Verwendung mit .net 4?

Ich habe es geschafft, Code mit der Vorschau zu kompilieren, indem ich auf die AsyncCTP-Laufzeit verwiesen habe. Da das CTP jedoch seltsame Lizenzbedingungen hat, scheint dies keine gute langfristige Lösung zu sein.

Oder sollte ich eine Implementierung eines Drittanbieters verwenden? Vielleicht hat Mono einen?

Für die Verteilung der Bibliothek ziehe ich es vor, die DLL einfach im selben Verzeichnis wie die Anwendung abzulegen, anstatt eine Art Installationsprogramm.

Ich würde es auch mögen, wenn meine Binärdateien unter Mono + Linux / MacOS ohne Änderungen funktionieren würden. Daher sollte die Laufzeit entweder mit dem integrierten Mono (wahrscheinlich 2.12) kompatibel sein oder die Verwendung unter Nicht-Windows-Betriebssystemen ermöglichen.

CodesInChaos
quelle
1
Ich glaube nicht, dass Sie mit einer CTP-Version weit kommen werden, da Sie nichts weitergeben dürfen, was Teil einer CTP mit einer kommerziellen Anwendung ist. Es lauern sicherlich Fehler herum und es ist noch nicht für die Leistung optimiert. Sie werden es vielleicht schneller entwickeln, aber Ihre Kunden werden nicht gerne Beta-Software installieren, die die endgültig veröffentlichten Versionen beeinträchtigen könnte.
Alois Kraus
@Alois Die späteren Versionen von AsyncCTP ermöglichen eine Umverteilung. Und das Schlimmste, was passieren kann, sind meine Bewerbungsunterbrechungen. Es ist nicht so, dass es andere Anwendungen stören kann, daher verstehe ich Ihr Konzert nicht als Störung der endgültigen Version. Ein Teil meiner Frage ist auch, ob es jemals eine endgültige Version geben wird, die WinXP überhaupt unterstützt.
CodesInChaos
1
In der Lizenz heißt es eindeutig (Async CTP 3): "1.a.ii. Sie erklären sich damit einverstanden, die Nutzung sofort nach Benachrichtigung von Microsoft einzustellen." Ich vermute, dass dieser Hinweis von MS kommt, wenn er veröffentlicht wird. Ich bin kein Anwalt, aber ich bin sicher, dass Ihre Rechtsabteilung (falls Sie eine haben) gerne Ihre Überlegungen hören würde, wie Sie dies umgehen möchten, ohne die Lizenzbedingungen zu verletzen.
Alois Kraus

Antworten:

106

Microsoft hat das Async Targeting Pack (Microsoft.Bcl.Async) über Nuget als Ersatz für AsyncCTP veröffentlicht.

Weitere Informationen finden Sie hier: http://blogs.msdn.com/b/bclteam/archive/2013/04/17/microsoft-bcl-async-is-now-stable.aspx .

Informationen zur vorherigen Version finden Sie hier: http://blogs.msdn.com/b/lucian/archive/2012/04/24/async-targeting-pack.aspx .

Da dieses Paket offiziell unterstützt wird, glaube ich jetzt, dass die beste Option für das Targeting von XP + Async die Verwendung von Visual Studio 2012 + C # 5 + Async Targeting Pack ist.

Wenn Sie jedoch das Ziel haben, auf .NET 3.5 abzuzielen , können Sie (meine) AsyncBridge für .NET 3.5 weiterhin verwenden .

Omer Mor
quelle
Ich kann keinen Verweis auf eine Lizenz für Ihre AsyncBridge finden.
Tong
15
Beachten Sie, dass für die Verwendung des asynchronen Targeting Packs unter .NET 4.0 die Installation von KB2468871 erforderlich ist.
Ghord
Der KB2468871 wurde im Juni 2011 veröffentlicht (und 6 Monate später wurde v2 veröffentlicht), ist jedoch möglicherweise noch nicht installiert . Weitere Informationen finden Sie unter WiX - stackoverflow.com/a/9506530/968003 .
Alex Klaus
24

Wenn Sie bereit sind, andere .NET-Sprachen in Betracht zu ziehen, kann F # Ihr Problem lösen. Es hat seit Jahren den asynchronen {} Berechnungsausdruck und ist sogar mit .Net 2.0 abwärtskompatibel. Mindestanforderung ist Windows XP SP3. Die Laufzeit kann hier heruntergeladen werden .

Marc Sigrist
quelle
4

Es ist möglich, die Betaversion von VS 12 zu verwenden, um .NET 4.0 mit async / await als Ziel festzulegen.

Sie müssen Code in Ihr Projekt kopieren, der die Typen enthält, auf die sich der Compiler stützt.

Details hier

Bearbeiten: Wir haben diese Technik übernommen und in eine Open-Source-Bibliothek namens AsyncBridge umgewandelt: https://nuget.org/packages/AsyncBridge

Alex Davies
quelle
3

Wenn Sie Ihre Software vertreiben möchten, ist die Mono-Lösung meiner Meinung nach derzeit wirklich Ihre einzige Option. Sie sagen auch, dass das Endergebnis unter Mono über Linux und OS X ausgeführt werden soll. Die Ausrichtung auf Mono scheint zunächst die natürliche Lösung zu sein.

Ihre nächste Ausgabe ist die IDE. MonoDevelop würde natürlich gut funktionieren, aber Sie sagen, Sie bevorzugen Visual Studio.

Greg Hurlman hat aus Visual Studio ein Profil zum Codieren gegen Mono 2.8 erstellt. Wenn Sie mit ihm Kontakt aufnehmen, kann er Sie möglicherweise in die richtige Richtung für die Entwicklung gegen Mono 2.11 / 2.12 in Visual Studio weisen.

Natürlich gibt es auch Mono Tools für Visual Studio , ein kommerzielles Produkt. Ich gehe davon aus, dass es noch von Xamarin angeboten wird .

Möglicherweise können Sie auch die erforderlichen 4.5-Profilassemblys von Mono über .NET ausführen, aber das habe ich nicht versucht. Das 4.5-Profil ist eine strikte Obermenge der 4.0-API. Vielleicht probieren Sie es aus und melden Sie sich zurück.

BEARBEITEN: Es sieht so aus, als könnten Sie das Visual Studio Async CTP jetzt in der Produktion verwenden

Folgendes steht auf der Download-Seite :

Enthält eine neue EULA für die Produktion. Hinweis - Diese Lizenz ist keine Aufforderung für Sie, das CTP für Ihren Produktionscode zu verwenden. Das CTP bleibt eine nicht unterstützte Technologievorschau, die auf eigenes Risiko verwendet wird. Wir haben jedoch viele Anfragen von Entwicklern erhalten, das CTP für Produktionscode zu verwenden, und haben daher die Lizenz geändert, um dies zu ermöglichen.

Justin
quelle
Was ich in der Entwicklung verwende, ist das kleine Problem. Das Hauptproblem ist, was ich meinen WinXP-Benutzern geben sollte. Schlagen Sie vor, Mono 2.12 mit meiner Anwendung zu bündeln?
CodesInChaos
Gestern habe ich mir die Monoquellen angesehen, und zumindest einige der asynchronen Kernklassen ( Async...Builderund ...Awaiter) sind sehr schwer vom Rest von Mono zu trennen. Derzeit beschäftige ich mich mit der Neuimplementierung AsyncCtpLibraryund leihe möglicherweise etwas von Mono aus.
CodesInChaos
Bei der Weiterverteilung AsyncCtpLibraryweiß ich, dass dies grundsätzlich möglich ist, aber zum einen enthält die Lizenz einige seltsame Klauseln. Aber mein Hauptproblem hier ist, was auf lange Sicht passiert. Wenn es nicht mehr unterstützt wird und niemand Fehler darin behoben hat, kann dies ärgerlich sein.
CodesInChaos
2

Wenn Sie mit der Verteilung Ihrer Software nach der Veröffentlichung von C # 5.0 durch MS beginnen möchten, können Sie mit der Entwicklung mit AsycnCTP beginnen. Andernfalls würde ich Ihnen nicht empfehlen, es zu verwenden, da es sich nur um CTP handelt, nicht einmal um eine Beta. Es kann sehr nahe an der Beta-Phase und an der Veröffentlichung geändert werden. Es kann instabil sein, etc.

Wenn Sie einfache asynchrone Vorgänge in Ihre Anwendung einführen möchten, würde ich Ihnen empfehlen, reaktive Erweiterungen und darauf aufgebaute Dinge (reaktive Benutzeroberfläche usw.) zu verwenden. Es ist einfach wunderschön.

VS2012 enthält, soweit ich mich erinnere, dasselbe Async-CTP, das ich von meiner // Build / Tablet-MS erhalten habe, die ich auf dieser Konferenz erhalten habe.

Alexey Raga
quelle
1
Es ist mir egal, auf die Veröffentlichung von VS2012 zu warten. Ich erwarte, dass VS2012 veröffentlicht wird, bevor meine Software kein Alpha mehr hat. Aber selbst wenn VS2012 veröffentlicht ist, möchte ich nicht auf .net 4.5 abzielen, da dies unter WinXP nicht verfügbar zu sein scheint. Das Hauptproblem ist also, welche asynchrone Laufzeit auf .net 4 verwendet werden soll.
CodesInChaos