2012-02-02 5 views
136

Je commence actuellement à créer une application qui bénéficierait beaucoup de la fonction d'attente asynchrone C# 5. Mais je ne suis pas sûr de la version de VS et de l'exécution asynchrone à utiliser.Utiliser async-await sur .net 4

En regardant les graphiques de popularité du système d'exploitation, je vais devoir supporter Windows XP pour encore 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 ce faire:

  • VS2010 avec AsyncCTP
  • VS2012 Aperçu (et dernière fois qu'il arrive), fixant l'objectif à 4,0 .net
  • Mono (On ​​dirait que 2.12 a async-attente, je préfère/suis utilisé pour VS sur MonoDevelop comme IDE)

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

Et plus important quel runtime utiliser?

Est-ce que VS2012 contient une exécution asynchrone redistribuable pour une utilisation avec .net 4?

J'ai réussi à compiler du code, avec l'aperçu, en faisant référence à l'exécution AsyncCTP. Mais puisque 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 le mono en a un?

Pour la distribution de la bibliothèque, je préfère simplement placer la DLL dans le même répertoire que l'application, plutôt que dans un programme d'installation.

J'aimerais aussi que mes binaires fonctionnent sans modifications sur mono + Linux/MacOS. Ainsi, le runtime devrait être soit compatible avec tout ce qui est mono (2.12 probablement), soit permettre l'utilisation sur des systèmes d'exploitation non Windows.

+1

Je ne pense pas que vous allez aller loin avec une version CTP car 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 traînent et il n'est pas encore optimisé pour la performance.Vous le développerez peut-être plus rapidement, mais vos clients ne seront pas heureux d'installer un logiciel bêta qui pourrait interférer avec les versions finales. –

+0

@Alois Les versions ultérieures de l'AsyncCTP permettent la redistribution. Et la pire chose qui puisse arriver est la rupture de mon application. Ce n'est pas comme si cela pouvait interférer avec d'autres applications, donc je ne vois pas comment votre concert pourrait interférer avec la version finale. Une partie de ma question est également de savoir s'il y aura une version finale qui prendra en charge WinXP en premier lieu. – CodesInChaos

+1

La licence stipule clairement (Async CTP 3) "1.a.ii vous acceptez de cesser immédiatement une telle utilisation sur avis de Microsoft;". Je soupçonne que cet avis proviendra de MS quand il sera publié. Je ne suis pas avocat mais je suis sûr que votre service juridique (si vous en avez un) aimerait entendre votre raisonnement comment vous voulez contourner cela sans enfreindre les termes de la licence. –

Répondre

105

Microsoft a publié le Async Targeting Pack (Microsoft.Bcl.Async) par Nuget en remplacement de la AsyncCTP. Vous pouvez en lire plus ici: http://blogs.msdn.com/b/bclteam/archive/2013/04/17/microsoft-bcl-async-is-now-stable.aspx.

Vous pouvez lire sur 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 supporté, je pense maintenant que la meilleure option pour cibler XP + asynchrone 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 for .NET 3.5.

+0

Je ne trouve aucune référence à une licence pour votre AsyncBridge? – toong

+1

Cochez ici: https://github.com/OmerMor/AsyncBridge/blob/master/src/AsyncBridge/readme.txt –

+14

Gardez à l'esprit que l'utilisation du pack de ciblage asynchrone sur .NET 4.0 requiert l'installation de KB2468871. – ghord

2

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

Si vous voulez introduire des opérations asynchrones faciles dans votre application je vous recommanderais d'employer des prolongements réactifs et des choses construites sur le dessus (interface réactive, etc.), c'est juste beautiul.

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

+1

Je ne me soucie pas d'attendre la sortie de VS2012. Je m'attends à ce que VS2012 soit libéré avant que mon logiciel ne soit en alpha. Mais même une fois que VS2012 est sorti, je ne veux pas cibler .net 4.5, car cela ne semble pas être disponible sur WinXP. Donc, le principal problème est quel runtime asynchrone à utiliser sur. Net 4. – CodesInChaos

3

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

Le numéro suivant est celui de l'IDE. MonoDevelop fonctionnerait bien mais vous dites que vous préférez Visual Studio.

Greg Hurlman created a profile pour coder contre Mono 2.8 à partir de Visual Studio. Si vous suivez avec lui, il pourrait être en mesure de vous diriger dans la bonne direction pour le développement de Mono 2.11/2.12 dans Visual Studio.

Bien sûr, il y a aussi Mono Tools for Visual Studio qui est un produit commercial. Je suppose qu'il est toujours offert par Xamarin.

Vous pouvez également exécuter les assemblages 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 rapporter.

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

Voici ce qu'il dit sur le download page:

Comprend un nouveau contrat de licence pour l'utilisation de la production. Remarque - Cette licence ne constitue pas constituent un encouragement pour vous d'utiliser le CTP pour votre code de production . Le CTP reste un aperçu de la technologie non pris en charge et utilisé à vos risques et périls. Cependant, nous avons reçu de nombreuses demandes de développeurs pour utiliser le CTP pour le code de production, et ont donc changé la licence pour permettre cela.

+0

Ce que j'utilise dans le développement est le problème mineur. Le problème majeur est ce que je devrais donner à mes utilisateurs WinXP. Suggérez-vous bundle mono 2.12 avec mon application? – CodesInChaos

+0

Hier, j'ai regardé dans les sources mono, et au moins plusieurs des classes asynchrones de base ('Async ... Builder' et' ... Awaiter') sont très difficiles à séparer du reste du mono. Actuellement, je cherche à ré-implémenter 'AsyncCtpLibrary', en empruntant peut-être un peu de mono. – CodesInChaos

+0

En redistribuant 'AsyncCtpLibrary', je sais que c'est possible en principe, mais pour un, la licence contient quelques clauses étranges. Mais mon problème principal ici est ce qui se passe à long terme. Si elle n'est pas supportée, et que personne ne corrige de bogues, cela peut être ennuyeux. – CodesInChaos

24

Si vous êtes ouvert à d'autres langues .Net, F # peut résoudre votre problème. Il a eu l'expression de calcul async {} pendant 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é here.

3

Il est possible d'utiliser VS 12 beta 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 here

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