Usando async-await en .net 4

137

Actualmente estoy empezando a crear una aplicación que se beneficiaría mucho de la función de espera asíncrona de C # 5. Pero no estoy seguro de qué versión de VS y del tiempo de ejecución asíncrono usar.

Mirando las tablas de popularidad del sistema operativo, tendré que soportar Windows XP por otros tres años más o menos. Parece que .net 4.5 solo se ejecuta en versiones más nuevas de Windows, por lo que necesito apuntar a .net 4.0. Las máquinas de desarrollo usan Windows 7, por lo que usar una versión más nueva de VS no es un problema.

Ahora tengo que elegir primero un compilador para hacer esto:

  • VS2010 con AsyncCTP
  • Vista previa de VS2012 (y final una vez que llega), estableciendo el objetivo en .net 4.0
  • Mono (Parece que 2.12 tiene espera asíncrona, prefiero / estoy acostumbrado a VS sobre MonoDevelop como IDE)

¿Cuál tiene menos errores de generación de código? Mirando el blog de Jon Skeet, la Vista previa de VS2012 utiliza un generador de código nunca más que el CTP.

¿Y más importante qué tiempo de ejecución utilizar?

¿VS2012 contiene un tiempo de ejecución asincrónico redistribuible para usar con .net 4?

Logré compilar código, con la vista previa, haciendo referencia al tiempo de ejecución AsyncCTP. Pero dado que el CTP tiene condiciones de licencia extrañas, no parece una buena solución a largo plazo.

¿O debería usar una implementación de terceros? Quizás mono tiene uno?

Para distribuir la biblioteca, prefiero simplemente colocar el dll en el mismo directorio que la aplicación, en lugar de algún tipo de instalador.

También me gustaría que mis archivos binarios funcionen sin cambios en mono + Linux / MacOS. Por lo tanto, el tiempo de ejecución debería ser compatible con lo que sea mono (2.12 probablemente) incorporado o permitir su uso en sistemas operativos que no sean Windows.

CodesInChaos
fuente
1
No creo que llegue lejos con una versión CTP ya que no se le permitirá redistribuir nada que sea parte de un CTP con una aplicación comercial. Seguramente hay errores al acecho y todavía no está optimizado para el rendimiento. Quizás lo desarrolle más rápido, pero sus clientes no estarán felices de instalar un software beta que podría interferir con las versiones lanzadas finalmente.
Alois Kraus
@Alois Las versiones posteriores de AsyncCTP permiten la redistribución. Y lo peor que puede pasar es que mi aplicación se rompa. No es que pueda interferir con otras aplicaciones, por lo que no veo entender su concierto por la interferencia con la versión final. También parte de mi pregunta es si alguna vez habrá una versión final que admita WinXP en primer lugar.
CodesInChaos
1
La licencia establece claramente (Async CTP 3) "1.a.ii. usted acepta dejar de usarlo inmediatamente después de la notificación de Microsoft;". Sospecho que este aviso vendrá de MS cuando se publique. No soy un abogado, pero estoy seguro de que a su departamento legal (si tiene uno) le encantaría escuchar su razonamiento sobre cómo quiere evitar esto sin romper los términos de la licencia.
Alois Kraus

Respuestas:

106

Microsoft lanzó el Async Targeting Pack (Microsoft.Bcl.Async) a través de Nuget como reemplazo del AsyncCTP.

Puede leer más sobre esto aquí: http://blogs.msdn.com/b/bclteam/archive/2013/04/17/microsoft-bcl-async-is-now-stable.aspx .

Puede leer sobre la versión anterior aquí: http://blogs.msdn.com/b/lucian/archive/2012/04/24/async-targeting-pack.aspx .

Como este paquete es oficialmente compatible, ahora creo que la mejor opción para apuntar a XP + asincrónico sería usar Visual Studio 2012 + C # 5 + Async Targeting Pack.

Sin embargo, si siente la necesidad de apuntar a .NET 3.5, aún puede usar (my) AsyncBridge para .NET 3.5 .

Omer Mor
fuente
¿No puedo encontrar ninguna referencia a una licencia para su AsyncBridge?
toong
15
Tenga en cuenta que el uso del paquete de orientación asíncrona en .NET 4.0 requiere la instalación de KB2468871.
ghord
El KB2468871 se lanzó en junio de 2011 (y 6 meses después se lanzó v2), pero aún no se puede instalar, así que vea cómo verificarlo en WiX: stackoverflow.com/a/9506530/968003 .
Alex Klaus
24

Si está abierto a considerar otros idiomas .Net, F # puede resolver su problema. Ha tenido la expresión de cálculo asíncrono {} durante años y es compatible con versiones anteriores incluso con .Net 2.0. El requisito mínimo es Windows XP SP3. El tiempo de ejecución se puede descargar aquí .

Marc Sigrist
fuente
4

Es posible usar VS 12 beta para apuntar a .NET 4.0 usando async / await.

Debe copiar algún código en su proyecto que proporcione los tipos en los que se basa el compilador.

Detalles aquí

Editar: hemos tomado esta técnica y la hemos convertido en una biblioteca de código abierto llamada AsyncBridge: https://nuget.org/packages/AsyncBridge

Alex Davies
fuente
3

Si desea poder distribuir su software, creo que la solución Mono es realmente su única opción en este momento. También dice que desea que el resultado final se ejecute en Mono sobre Linux y OS X. Para empezar, apuntar a Mono parece ser la solución natural.

Su próximo problema es el IDE. MonoDevelop obviamente funcionaría bien, pero usted dice que prefiere Visual Studio.

Greg Hurlman creó un perfil para codificar contra Mono 2.8 de Visual Studio. Si haces un seguimiento con él, él podría indicarte la dirección correcta para desarrollar contra Mono 2.11 / 2.12 en Visual Studio.

Por supuesto, también hay Mono Tools para Visual Studio, que es un producto comercial. Supongo que Xamarin todavía lo ofrece .

También es posible que pueda ejecutar los ensamblados de perfil 4.5 necesarios desde Mono sobre .NET, pero no lo he intentado. El perfil 4.5 es un superconjunto estricto de la API 4.0. Tal vez intentarlo e informar de nuevo.

EDITAR: Parece que ahora puede usar Visual Studio Async CTP en producción ahora

Esto es lo que dice en la página de descarga :

Incluye un nuevo EULA para uso en producción. Nota: esta licencia no constituye un estímulo para que utilice el CTP para su código de producción. El CTP sigue siendo una Vista previa de tecnología no compatible y de uso bajo su propio riesgo. Sin embargo, hemos recibido muchas solicitudes de los desarrolladores para usar el CTP para el código de producción, por lo que hemos cambiado la licencia para permitirlo.

Justin
fuente
Lo que uso en el desarrollo es el problema menor. El problema principal es lo que debo entregar a mis usuarios de WinXP. ¿Sugiere paquete mono 2.12 con mi aplicación?
CodesInChaos
Ayer examiné las fuentes mono, y al menos varias de las clases asíncronas centrales ( Async...Buildery ...Awaiter) son muy difíciles de separar del resto de mono. Actualmente estoy buscando volver a implementar AsyncCtpLibrary, posiblemente tomando prestado un poco de mono.
CodesInChaos
Al redistribuir AsyncCtpLibrary, sé que en principio es posible, pero para uno la licencia contiene algunas cláusulas extrañas. Pero mi problema principal aquí es lo que sucede a largo plazo. Si deja de ser compatible y nadie solucionó errores, podría ser molesto.
CodesInChaos
2

Si desea comenzar a distribuir su software después de que MS lance C # 5.0, puede comenzar a desarrollar usando AsycnCTP. De lo contrario, no recomendaría que lo use, ya que es solo CTP, ni siquiera una versión beta. Se puede cambiar mucho cerca de la etapa beta y del lanzamiento. Puede ser inestable, etc.

Si desea introducir operaciones asíncronas sencillas en su aplicación, le recomendaría que use Extensiones Reactivas y cosas integradas en la parte superior (IU Reactiva, etc.), es simplemente hermoso.

En cuanto a VS2012, también contiene el mismo Async CTP por lo que recuerdo de mi // Build / tablet MS que me dio en esa conferencia.

Alexey Raga
fuente
1
No me importa esperar el lanzamiento de VS2012. Espero que VS2012 se lance antes de que mi software se quede sin alfa. Pero incluso una vez que se lanza VS2012, no quiero apuntar a .net 4.5, ya que parece que no está disponible en WinXP. Entonces, el problema principal es qué tiempo de ejecución asíncrono usar en .net 4.
CodesInChaos