Utilizzo di async-waitit su .net 4


137

Al momento sto iniziando a creare un'applicazione che trarrebbe molto profitto dalla funzionalità asincrona di C # 5. Ma non sono sicuro di quale versione di VS e del runtime asincrono utilizzare.

Guardando i grafici di popolarità del sistema operativo, dovrò supportare Windows XP per altri tre anni circa. Sembra che .net 4.5 funzioni solo su versioni più recenti di Windows, quindi devo scegliere come target .net 4.0. Le macchine di sviluppo utilizzano Windows 7, quindi l'utilizzo di una versione più recente di VS non è un problema.

Ora devo prima scegliere un compilatore per fare questo:

  • VS2010 con AsyncCTP
  • Anteprima VS2012 (e finale una volta arrivato), impostando la destinazione su .net 4.0
  • Mono (sembra che 2.12 abbia async-waitit, preferisco / sono abituato a VS su MonoDevelop come IDE)

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

E ancora più importante quale runtime usare?

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 di AsyncCTP. Ma dal momento che il CTP ha strane condizioni di licenza, questa non sembra una buona soluzione a lungo termine.

O dovrei usare un'implementazione di terze parti? Forse mono ne ha uno?

Per distribuire la libreria preferisco semplicemente mettere la dll nella stessa directory dell'applicazione, anziché un qualche tipo 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 qualunque cosa mono (probabilmente 2.12) abbia incorporato, o consentire l'uso su sistemi operativi non Windows.


1
Non credo che andrai lontano con una versione CTP poiché 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 software beta che potrebbe interferire con le versioni finalmente rilasciate.
Alois Kraus,

@Alois Le versioni successive di AsyncCTP consentono la ridistribuzione. E la cosa peggiore che può accadere è la mia interruzione dell'applicazione. Non è che possa interferire con altre applicazioni, quindi non vedo capire il tuo concerto a causa delle interferenze con la versione finale. Anche parte della mia domanda è se ci sarà mai una versione finale che supporta WinXP in primo luogo.
CodesInChaos,

1
La licenza indica chiaramente (Async CTP 3) "1.a.ii. l'utente accetta di cessare tale uso immediatamente previa notifica da parte di Microsoft;". Ho il sospetto che questo avviso verrà dalla SM quando verrà rilasciato. Non sono un avvocato, ma sono sicuro che il vostro ufficio legale (se ne avete uno) adorerebbe ascoltare la vostra logica su come aggirare il problema senza infrangere i termini della licenza.
Alois Kraus

Risposte:


106

Microsoft ha rilasciato Async Targeting Pack (Microsoft.Bcl.Async) tramite Nuget in sostituzione di AsyncCTP.

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

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

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

Se senti la necessità di scegliere come target .NET 3.5, puoi comunque utilizzare (my) AsyncBridge per .NET 3.5 .


Non riesco a trovare alcun riferimento a una licenza per il tuo AsyncBridge?
Toong


15
Tieni presente che l'utilizzo del pacchetto di targeting asincrono su .NET 4.0 richiede l'installazione di KB2468871.
gh

KB2468871 è stato rilasciato nel giugno 2011 (e 6 mesi dopo è stato rilasciato v2), ma potrebbe non essere ancora installato, quindi vedi come controllarlo in WiX - stackoverflow.com/a/9506530/968003 .
Alex Klaus,

24

Se sei aperto a prendere in considerazione altri linguaggi .Net, F # può risolvere il tuo 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 qui .


4

È possibile utilizzare la versione beta di VS 12 per targetizzare .NET 4.0 usando async / await.

Devi copiare del codice nel tuo progetto che fornisca i tipi su cui si basa il compilatore.

Dettagli qui

Modifica: abbiamo adottato questa tecnica e l'abbiamo trasformata in una libreria open source chiamata AsyncBridge: https://nuget.org/packages/AsyncBridge


3

Se vuoi essere in grado di distribuire il tuo 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 Mono per iniziare sembra la soluzione naturale.

Il tuo prossimo numero è l'IDE. Ovviamente MonoDevelop funzionerebbe bene ma dici di preferire Visual Studio.

Greg Hurlman ha creato un profilo per codificare su Mono 2.8 da Visual Studio. Se lo segui, potrebbe essere in grado di indicarti la giusta direzione per lo sviluppo contro Mono 2.11 / 2.12 in Visual Studio.

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

Potresti anche essere in grado di eseguire gli assembly di profili 4.5 richiesti da Mono su .NET, ma non l'ho provato. Il profilo 4.5 è un super set rigoroso dell'API 4.0. Forse provaci e riferiscilo.

EDIT: sembra che ora puoi usare Visual Studio Async CTP in produzione

Ecco cosa dice sulla pagina di download :

Include un nuovo EULA per l'uso in produzione. Nota: questa licenza non costituisce un incoraggiamento per l'utilizzo del CTP per il codice di produzione. Il CTP rimane un'anteprima tecnologica non supportata e utilizzabile a proprio rischio. Tuttavia, abbiamo ricevuto molte richieste dagli sviluppatori di utilizzare il CTP per il codice di produzione e quindi abbiamo modificato la licenza per consentirlo.


Quello che uso nello sviluppo è il problema minore. Il problema principale è ciò che dovrei consegnare ai miei utenti WinXP. Suggerisci bundle mono 2.12 con la mia applicazione?
Codici InCos

Ieri ho esaminato le fonti mono e almeno alcune delle classi asincrone core ( Async...Buildere ...Awaiter) sono molto difficili da separare dal resto del mono. Attualmente sto cercando di ri-implementare AsyncCtpLibrary, eventualmente prendendo in prestito un po 'da mono.
Codici InCos

Per quanto riguarda la ridistribuzione AsyncCtpLibrary, so che è possibile in linea di principio, ma per uno la licenza contiene alcune strane clausole. Ma il mio problema principale qui è quello che succede a lungo termine. Se diventa non supportato e nessuno corregge bug, potrebbe essere fastidioso.
Codici InCos

2

Se vuoi iniziare a distribuire il tuo software dopo che MS ha rilasciato C # 5.0, puoi iniziare a sviluppare usando AsycnCTP. Altrimenti non ti consiglierei di usarlo, in quanto è solo CTP, nemmeno una beta. Può essere cambiato molto vicino allo stadio beta e al rilascio. Potrebbe essere instabile, ecc.

Se vuoi introdurre semplici operazioni asincrone nella tua applicazione, ti consiglio di usare le estensioni reattive e le cose costruite in cima (UI reattiva, ecc.), È semplicemente bello.

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


1
Non mi interessa aspettare il rilascio di VS2012. Mi aspetto che VS2012 venga rilasciato prima che il mio software sia uscito dall'alfa. Ma anche una volta rilasciato VS2012, non voglio scegliere come target .net 4.5, poiché non sembra essere disponibile su WinXP. Quindi il problema principale è quale runtime asincrono usare su .net 4.
CodesInChaos
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.