2012-02-02 11 views
136

Attualmente sto iniziando a creare un'applicazione che trarrebbe profitto dalla funzione asincrone del C# 5. Ma non sono sicuro di quale versione di VS e del runtime async utilizzare.Uso async-await su .net 4

Guardando ai grafici di popolarità del sistema operativo, avrò bisogno di supportare Windows XP per altri tre anni circa. Sembra che .net 4.5 venga eseguito solo sulle versioni più recenti di Windows, quindi ho bisogno di utilizzare .net 4.0. Le macchine di sviluppo usano Windows 7, quindi l'uso di una versione più recente di VS non è un problema.

Ora ho bisogno di scegliere prima un compilatore per fare questo:

  • VS2010 con AsyncCTP
  • VS2012 Preview (e ultima volta che arriva), impostando l'obiettivo di NET 4.0
  • Mono (Sembra 2.12 ha async-await, preferisco/sono abituato a VS su MonoDevelop come IDE)

Quale ha meno bug di code-gen? Guardando a Jon Skeet's blog, l'anteprima VS2012 utilizza un generatore di codice mai usato rispetto al CTP.

E, ancora più importante, quale runtime utilizzare?

VS2012 contiene un runtime asincrono ridistribuibile per l'uso con .net 4?

Sono riuscito a compilare il codice, con l'anteprima, facendo riferimento al runtime AsyncCTP. Ma dal momento che il CTP ha strane condizioni di licenza, non sembra una buona soluzione a lungo termine.

Oppure devo utilizzare un'implementazione di terze parti? Forse mono ne ha uno?

Per la distribuzione della libreria, preferisco semplicemente inserire la DLL nella stessa directory dell'applicazione, invece di una sorta di programma di installazione.

Mi piacerebbe anche se i miei binari funzionassero senza modifiche su mono + Linux/MacOS. Quindi il runtime dovrebbe essere compatibile con qualsiasi cosa sia mono (probabilmente 2.12), o consentire l'uso su sistemi operativi non Windows.

+1

Non credo che riuscirai a ottenere una versione CTP in quanto non ti sarà permesso di ridistribuire tutto ciò che fa parte di un CTP con un'applicazione commerciale. Ci sono sicuramente bug in agguato e non è ancora ottimizzato per le prestazioni.Forse lo svilupperai più rapidamente, ma i tuoi clienti non saranno felici di installare un software beta che potrebbe interferire con le versioni finalmente rilasciate. –

+0

@Alois Le versioni successive di AsyncCTP consentono la ridistribuzione. E la cosa peggiore che può succedere è la mia domanda si rompe. Non è come se potesse interferire con altre applicazioni, quindi non vedo capire il tuo concerto a causa di interferenze con la versione finale. Inoltre, parte della mia domanda è se ci sarà mai una versione finale che supporti WinXP in primo luogo. – CodesInChaos

+1

La licenza indica chiaramente (Async CTP 3) "1.a.ii. l'utente accetta di cessare tale utilizzo immediatamente previa notifica da Microsoft;". Sospetto che questo avviso verrà dalla MS quando verrà rilasciato. Non sono un avvocato, ma sono sicuro che il tuo dipartimento legale (se ne possiedi uno) gradirebbe conoscere le tue motivazioni su come vuoi aggirare il problema senza rompere i termini della licenza. –

risposta

105

Microsoft ha rilasciato la Async Targeting Pack (Microsoft.Bcl.Async) attraverso Nuget come un sostituto per l'AsyncCTP.

Potete leggere di più qui: http://blogs.msdn.com/b/bclteam/archive/2013/04/17/microsoft-bcl-async-is-now-stable.aspx.

Qui è possibile leggere la versione precedente: http://blogs.msdn.com/b/lucian/archive/2012/04/24/async-targeting-pack.aspx.

Poiché questo pacchetto è ufficialmente supportato, ora credo che l'opzione migliore per il targeting di XP + asincrona sarebbe utilizzare Visual Studio 2012 + C# 5 + Async Targeting Pack.

Se si sente la necessità di scegliere come destinazione .NET 3.5, è comunque possibile utilizzare (my) AsyncBridge for .NET 3.5.

+0

Non riesco a trovare alcun riferimento a una licenza per AsyncBridge? – toong

+1

Controlla qui: https://github.com/OmerMor/AsyncBridge/blob/master/src/AsyncBridge/readme.txt –

+14

Ricorda che l'utilizzo del pacchetto di targeting asincrono su .NET 4.0 richiede l'installazione di KB2468871. – ghord

2

Se si desidera avviare la distribuzione del software dopo che MS rilascia C# 5.0, è possibile iniziare a sviluppare utilizzando AsycnCTP. Altrimenti non ti consiglierei di usarlo, visto che è solo CTP, nemmeno una beta. Può essere cambiato molto vicino alla fase beta e alla versione. Può essere instabile, ecc.

Se si desidera introdurre semplici operazioni asincrone nell'applicazione, si consiglia di utilizzare le estensioni reattive e gli elementi incorporati in cima (interfaccia utente reattiva, ecc.), È semplicemente meraviglioso.

Come per VS2012, contiene anche lo stesso CTP asincrono, per quanto ricordo dal mio // Build/tablet MS mi ha dato in quella conferenza.

+1

Non mi interessa aspettare la versione VS2012. Mi aspetto che VS2012 venga rilasciato prima che il mio software non sia alfa. Ma anche una volta rilasciato VS2012, non voglio prendere di mira .net 4.5, poiché non sembra essere disponibile su WinXP. Quindi il problema principale è quale runtime asincrono utilizzare su .net 4. – CodesInChaos

3

Se si desidera poter distribuire il software, penso che la soluzione Mono sia davvero l'unica opzione al momento. Dici anche che vuoi che il risultato finale venga eseguito su Mono su Linux e OS X. Il targeting di Mono per iniziare sembra la soluzione naturale.

Il tuo prossimo numero è l'IDE. MonoDevelop funzionerebbe ovviamente, ma tu dici che preferisci Visual Studio.

Greg Hurlman created a profile codice per Mono 2.8 da Visual Studio. Se segui con lui, potrebbe essere in grado di indicarti la direzione giusta per lo sviluppo contro Mono 2.11/2.12 in Visual Studio.

Naturalmente, c'è anche Mono Tools for Visual Studio che è un prodotto commerciale. Suppongo che sia ancora offerto da Xamarin.

Potresti anche essere in grado di eseguire i 4,5 profili profilo richiesti da Mono su .NET, ma non l'ho provato. Il profilo 4.5 è un super-set rigoroso dell'API 4.0. Forse dargli un colpo e riferire.

EDIT: Sembra che forse si può utilizzare il Visual Studio Async CTP attualmente in produzione

Ecco quello che dice sulla download page:

include un nuovo Contratto per l'uso in produzione. Nota: questa licenza non costituisce un incoraggiamento all'uso del CTP per il codice di produzione . Il CTP rimane un'Annotazione tecnologica non supportata e da utilizzare a proprio rischio . Tuttavia, abbiamo ricevuto molte richieste dagli sviluppatori di per utilizzare il CTP per il codice di produzione e così abbiamo modificato la licenza per consentirlo.

+0

Quello che uso in fase di sviluppo è il problema minore. Il problema principale è quello che dovrei dare ai miei utenti WinXP. Suggerite bundle mono 2.12 con la mia applicazione? – CodesInChaos

+0

Ieri ho esaminato le sorgenti mono e almeno alcune delle principali classi asincrone ('Async ... Builder' e' ... Awaiter') sono molto difficili da separare dal resto del mono. Attualmente sto cercando di ri-implementare 'AsyncCtpLibrary', forse prendendo in prestito un po 'da mono. – CodesInChaos

+0

In caso di ridistribuzione di 'AsyncCtpLibrary', so che è possibile in linea di principio, ma per uno la licenza contiene alcune strane clausole. Ma il mio problema principale qui è ciò che accade nel lungo periodo. Se non viene supportato e nessuno ha risolto bug, potrebbe essere fastidioso. – CodesInChaos

24

Se si è aperti a considerare altre lingue .Net, F # può risolvere il problema. Ha avuto l'espressione di calcolo asincrono {} per anni ed è retrocompatibile anche con .Net 2.0. Il requisito minimo è Windows XP SP3. Il runtime può essere scaricato here.

3

È possibile utilizzare il VS 12 beta per eseguire il collegamento a .NET 4.0 utilizzando async/await.

È necessario copiare del codice nel progetto che fornisce i tipi su cui si basa il compilatore.

dettagli here

Edit: abbiamo preso questa tecnica e lo ha trasformato in una libreria open source chiamato AsyncBridge: https://nuget.org/packages/AsyncBridge