whenall - task.run c#
Breve explicaciĆ³n de Async/Await en.Net 4.5 (3)
Las llamadas a los métodos seguirán ocurriendo secuencialmente al igual que las llamadas a los métodos "regulares", no esperadas. El propósito de esperar es que devolverá el subproceso actual al grupo de subprocesos mientras la operación esperada se ejecuta y hace lo que sea.
Esto es particularmente útil en entornos de alto rendimiento, por ejemplo, un servidor web, donde una solicitud determinada se procesa en un subproceso dado desde el conjunto de subprocesos en general. Si no esperamos, el subproceso dado que procesa la solicitud (y todos sus recursos) permanece "en uso" mientras se completa la llamada db / service. Esto puede llevar un par de segundos o más, especialmente para llamadas de servicio externas.
Ahora, en sitios web de poco tráfico, esto no es un gran problema, pero en los sitios de alto tráfico, el costo de todos estos subprocesos de solicitud se queda sin hacer nada, en un estado "en uso", esperando otros procesos como esas llamadas db / service para volver puede ser una carga de recursos.
Es mejor que liberemos el subproceso al grupo de trabajadores para permitirle realizar otro trabajo útil para alguna otra solicitud.
Una vez que finaliza la llamada db / service, podemos interrumpir el grupo de subprocesos y solicitar un subproceso para continuar procesando esa solicitud desde donde se detuvo. En ese punto, el estado de la solicitud se vuelve a cargar y la llamada al método continúa.
Por lo tanto, en función de la solicitud cuando se utiliza la espera, la solicitud seguirá tomando el mismo tiempo desde la perspectiva del usuario ... más una pequeña cantidad más por la sobrecarga de conmutación.
Pero en conjunto, en todas las solicitudes para todos los usuarios, las cosas pueden parecer más eficaces para todos los usuarios a medida que el servidor web (en este caso) se ejecuta de manera más eficiente con una mejor utilización de los recursos. es decir, no tiene que poner en cola las solicitudes en espera de subprocesos libres para procesar las solicitudes porque await las está devolviendo o, como alternativa, no tenemos que comprar más hardware porque estamos usando la misma cantidad de hardware, de manera más eficiente, para obtener más rendimientos
Sin embargo, esto implica un costo de cambio, por lo que, a pesar de lo que se ve en las plantillas predeterminadas y en muchos documentos, no debe simplemente esperar a la vista de cada llamada. Es solo una herramienta y como todas las herramientas tiene su lugar. Si el costo de conmutación no es menor que el costo de solo completar sus llamadas de manera sincrónica, entonces no debe usar esperar.
¿Cómo funcionan las tareas asíncronas (asíncronas / espera) en .Net 4.5?
Algún código de muestra:
private async Task<bool> TestFunction()
{
var x = await DoesSomethingExists();
var y = await DoesSomethingElseExists();
return y;
}
¿La segunda instrucción de await
se ejecuta de inmediato o después de la primera await
?
Se ejecuta después de las primeras vueltas de espera. Si esto te confunde, intenta jugar con puntos de interrupción, ya que son completamente compatibles con el nuevo patrón asíncrono.
Imagina que se vería así:
var x = await GetSomeObjectInstance();
var y = await GetSomeObjectInstance2(x);
Probablemente se produzca una NullReferenceException en algún lugar, por lo que la primera espera debe regresar primero. De lo contrario, x
sería nulo / indefinido o lo que sea.
await
pausar el método hasta que la operación se complete. Entonces, la segunda await
se ejecutaría después de la primera await
.
Para obtener más información, consulte la introducción de async
/ await
o las preguntas frecuentes oficiales .