usar puede operadores metodo carece await asincrono c# .net asynchronous go .net-4.5

c# - puede - el metodo asincrono carece de operadores await



¿Cuál es la diferencia principal entre.net Async y google go thread ligero? (1)

Hacer juicios de valor siempre es algo complicado, así que resaltaré 3 diferencias. Usted decide si caen en el cubo "pro" o "con".

  1. Si bien Go y async le permiten escribir código asíncrono de una manera directa, en .NET debe saber qué parte de su código es asíncrono y cuál no (es decir, debe usar explícitamente palabras clave async / await). En Go, no necesita saberlo: el tiempo de ejecución lo hace "solo funciona", no hay una sintaxis especial para marcar el código asíncrono.

  2. El diseño de Go no requiere ningún código especial en la biblioteca estándar. .NET requirió agregar nuevo código a la biblioteca estándar para cada operación asíncrona, esencialmente duplicando la superficie de la API para esos casos, por ejemplo, hay una nueva API de descarga http asíncrona y la antigua API de descarga http no asíncrona tiene que permanecer para la compatibilidad con versiones anteriores.

  3. Ir de diseño e implementación es órdenes de magnitud más simple. Una pequeña parte del código de tiempo de ejecución (planificador) se encarga de suspender los goroutines que bloquean las llamadas al sistema y ceder el paso a los goroutines dormidos. No hay necesidad de ningún soporte asíncrono especial en la biblioteca estándar.

La implementación de .NET primero requirió la adición de las nuevas API antes mencionadas. Además, la implementación de .NET se basa en el código de reescritura del compilador con async / await en máquinas de estado equivalentes. Es muy inteligente pero también bastante complicado. El resultado práctico fue que el primer CTP asíncrono tuvo errores conocidos, mientras que la implementación de Go funcionó bastante bien desde el principio.

En última instancia, realmente no importa. async / await es la mejor manera de escribir código async en .NET. Los goroutines son la mejor manera de conseguir eso en Go. Ambos son excelentes, especialmente en comparación con las alternativas en la mayoría de los otros idiomas.

Al llamar a runtime.GOMAXPROCS (1) en go, el tiempo de ejecución solo usará un hilo para todas tus goroutines. Cuando hagas io tus goroutines cederán y dejarán que los otros goroutines corran en el mismo hilo.

Esto me parece muy similar a cómo la característica .net Async CTP está realizando una concurrencia cooperativa si no está usando un hilo de fondo.

Mi pregunta es qué ventaja o inconveniente podría pensar de un método sobre el otro.