Utilisation de async-await sur .net 4

137

Je commence actuellement à créer une application qui profiterait beaucoup de la fonctionnalité d'attente asynchrone de C # 5. Mais je ne sais pas quelle version de VS et du runtime asynchrone utiliser.

En regardant les graphiques de popularité des systèmes d'exploitation, je devrai prendre en charge Windows XP pendant environ trois ans. Il semble que .net 4.5 ne fonctionne que sur les nouvelles versions de Windows, je dois donc cibler .net 4.0. Les machines de développement utilisent Windows 7, donc l'utilisation d'une version plus récente de VS n'est pas un problème.

Maintenant, je dois d'abord choisir un compilateur pour faire cela:

  • VS2010 avec AsyncCTP
  • VS2012 Preview (et final une fois arrivé), définissant la cible sur .net 4.0
  • Mono (On ​​dirait que 2.12 a async-await, je préfère / suis habitué à VS sur MonoDevelop comme IDE)

Lequel a le moins de bogues de génération de code? En regardant le blog de Jon Skeet, l'aperçu VS2012 n'utilise jamais un générateur de code que le CTP.

Et surtout quel runtime utiliser?

VS2012 contient-il un runtime asynchrone redistribuable à utiliser avec .net 4?

J'ai réussi à compiler du code, avec l'aperçu, en référençant le runtime AsyncCTP. Mais comme le CTP a des conditions de licence étranges, cela ne semble pas être une bonne solution à long terme.

Ou devrais-je utiliser une implémentation tierce? Peut-être que mono en a un?

Pour distribuer la bibliothèque, je préfère simplement mettre la dll dans le même répertoire que l'application, au lieu d'une sorte d'installation.

J'aimerais aussi que mes binaires fonctionnent sans changements sur mono + Linux / MacOS. Ainsi, le runtime doit soit être compatible avec tout ce que mono (2.12 probablement) a intégré, soit permettre une utilisation sur des OS non Windows.

CodesInChaos
la source
1
Je ne pense pas que vous irez loin avec une version CTP puisque vous ne serez pas autorisé à redistribuer tout ce qui fait partie d'un CTP avec une application commerciale. Il y a sûrement des bugs qui se cachent et ce n'est pas encore optimisé pour les performances. Vous serez peut-être en train de le développer plus rapidement, mais vos clients ne seront pas heureux d'installer des logiciels bêta qui pourraient interférer avec les versions enfin publiées.
Alois Kraus
@Alois Les dernières versions d'AsyncCTP permettent la redistribution. Et la pire chose qui puisse arriver est que ma candidature soit interrompue. Ce n'est pas comme si cela pouvait interférer avec d'autres applications, donc je ne vois pas comprendre votre concert par rapport à l'interférence avec la version finale. Une partie de ma question est également de savoir s'il y aura jamais une version finale prenant en charge WinXP en premier lieu.
CodesInChaos
1
La licence indique clairement (Async CTP 3) "1.a.ii. vous acceptez de cesser cette utilisation immédiatement après notification de Microsoft;". Je soupçonne que cet avis viendra de MS lorsqu'il sera publié. Je ne suis pas avocat, mais je suis sûr que votre service juridique (si vous en avez un) aimerait savoir comment vous voulez contourner ce problème sans enfreindre les termes de la licence.
Alois Kraus

Réponses:

106

Microsoft a publié le pack de ciblage Async (Microsoft.Bcl.Async) via Nuget en remplacement de AsyncCTP.

Vous pouvez en savoir plus ici: http://blogs.msdn.com/b/bclteam/archive/2013/04/17/microsoft-bcl-async-is-now-stable.aspx .

Vous pouvez consulter la version précédente ici: http://blogs.msdn.com/b/lucian/archive/2012/04/24/async-targeting-pack.aspx .

Comme ce pack est officiellement pris en charge, je pense maintenant que la meilleure option pour cibler XP + async serait d'utiliser Visual Studio 2012 + C # 5 + Async Targeting Pack.

Si vous ressentez le besoin de cibler .NET 3.5, vous pouvez toujours utiliser (mon) AsyncBridge pour .NET 3.5 .

Omer Mor
la source
Je ne trouve aucune référence à une licence pour votre AsyncBridge?
jusqu'au
15
Gardez à l'esprit que l'utilisation du pack de ciblage asynchrone sur .NET 4.0 nécessite l'installation de KB2468871.
ghord
Le KB2468871 a été publié en juin 2011 (et 6 mois plus tard, la version 2 a été publiée), mais il se peut qu'il ne soit toujours pas installé, alors voyez comment le vérifier sur WiX - stackoverflow.com/a/9506530/968003 .
Alex Klaus
24

Si vous êtes prêt à envisager d'autres langages .Net, F # peut résoudre votre problème. Il utilise l'expression de calcul async {} depuis des années et est rétrocompatible même avec .Net 2.0. La configuration minimale requise est Windows XP SP3. Le runtime peut être téléchargé ici .

Marc Sigrist
la source
4

Il est possible d'utiliser la version bêta de VS 12 pour cibler .NET 4.0 en utilisant async / await.

Vous devez copier du code dans votre projet qui fournit les types sur lesquels le compilateur s'appuie.

Détails ici

Edit: nous avons pris cette technique et l'avons transformée en une bibliothèque open source appelée AsyncBridge: https://nuget.org/packages/AsyncBridge

Alex Davies
la source
3

Si vous voulez pouvoir distribuer votre logiciel, je pense que la solution Mono est vraiment votre seule option pour le moment. Vous dites également que vous voulez que le résultat final s'exécute sur Mono sur Linux et OS X. Cibler Mono pour commencer semble être la solution naturelle.

Votre prochain problème est l'IDE. MonoDevelop fonctionnerait évidemment bien mais vous dites que vous préférez Visual Studio.

Greg Hurlman a créé un profil pour coder avec Mono 2.8 à partir de Visual Studio. Si vous faites un suivi avec lui, il pourra peut-être vous orienter dans la bonne direction pour développer contre Mono 2.11 / 2.12 dans Visual Studio.

Bien sûr, il existe également des Mono Tools pour Visual Studio qui est un produit commercial. Je suppose qu'il est toujours proposé par Xamarin .

Vous pourrez peut-être également exécuter les assemblys de profil 4.5 requis à partir de Mono au-dessus de .NET, mais je n'ai pas essayé cela. Le profil 4.5 est un super-ensemble strict de l'API 4.0. Peut-être essayer et faire un rapport.

EDIT: Il semble que vous pouvez peut-être utiliser le CTP Visual Studio Async en production maintenant

Voici ce qu'il dit sur la page de téléchargement :

Comprend un nouveau CLUF pour une utilisation en production. Remarque - Cette licence ne constitue pas un encouragement pour vous à utiliser le CTP pour votre code de production. Le CTP reste un aperçu technologique non pris en charge et à utiliser à vos propres risques. Cependant, nous avons reçu de nombreuses demandes de développeurs pour utiliser le CTP pour le code de production, et avons donc modifié la licence pour permettre cela.

Justin
la source
Ce que j'utilise dans le développement est le problème mineur. Le problème majeur est de savoir ce que je dois remettre à mes utilisateurs WinXP. Proposez-vous le bundle mono 2.12 avec mon application?
CodesInChaos
Hier, j'ai examiné les sources mono, et au moins plusieurs des classes asynchrones de base ( Async...Builderet ...Awaiter) sont très difficiles à séparer du reste de mono. Actuellement, je cherche à réimplémenter AsyncCtpLibrary, éventuellement en empruntant un peu à mono.
CodesInChaos
En AsyncCtpLibraryce qui concerne la redistribution , je sais que c'est possible en principe, mais pour l'un, la licence contient quelques clauses étranges. Mais mon principal problème ici est ce qui se passe à long terme. S'il n'est plus pris en charge et que personne n'a corrigé de bogue, cela pourrait être ennuyeux.
CodesInChaos
2

Si vous souhaitez commencer à distribuer votre logiciel après la publication de MS C # 5.0, vous pouvez commencer à développer à l'aide d'AsycnCTP. Sinon, je ne vous recommanderais pas de l'utiliser, car ce n'est que du CTP, pas même une version bêta. Il peut être beaucoup changé près de la phase bêta et de la sortie. Cela peut être instable, etc.

Si vous souhaitez introduire des opérations asynchrones faciles dans votre application, je vous recommanderais d'utiliser des extensions réactives et des éléments construits sur le dessus (interface utilisateur réactive, etc.), c'est tout simplement magnifique.

Quant à VS2012, il contient également le même CTP Async autant que je me souvienne de mon // Build / tablet MS m'a donné lors de cette conférence.

Alexey Raga
la source
1
Je m'en fiche d'attendre la sortie de VS2012. Je m'attends à ce que VS2012 soit publié avant que mon logiciel ne soit plus alpha. Mais même une fois VS2012 sorti, je ne veux pas cibler .net 4.5, car cela ne semble pas être disponible sur WinXP. Le principal problème est donc de savoir quel environnement d'exécution asynchrone utiliser sur .net 4.
CodesInChaos