¿Está bien pasar parámetros, con await? ¿Cuáles son las ventajas y desventajas de hacer esto?
var results = MapResults(await GetDataAsync());
var result = await GetDataAsync(); var map = MapResults(result)
¿Está bien pasar parámetros, con await? ¿Cuáles son las ventajas y desventajas de hacer esto?
var results = MapResults(await GetDataAsync());
var result = await GetDataAsync(); var map = MapResults(result)
Respuestas:
ACTUALIZACIÓN: Esta pregunta fue el tema de mi blog en marzo de 2020 . Véalo para más discusión sobre este tema. Gracias por la interesante pregunta!
Asumiré aquí que pretendías que fuera una llamada a la función como único miembro de la lista de argumentos.
Como otros han señalado, no hay diferencia entre
x = M(await FAsync());
y
var f = await FAsync();
x = M(f);
Y eso es lo mismo que
var ftask = FAsync();
x = M(await ftask)
Entonces, no importa de qué manera lo escribas, ¿correcto?
Piensa en eso.
En ese escenario específico, los tres flujos de trabajo son iguales. Pero hay una diferencia potencial aquí si solo variamos ligeramente el escenario. Considerar:
x = M(await FAsync(), await GAsync());
Esto es lo mismo que
var f = await FAsync();
var g = await GAsync();
x = M(f, g);
¿Y qué sabemos sobre este flujo de trabajo? ¡La tarea GAsync no se inicia hasta que finaliza la tarea FAsync! ¡Pero parece que hay una oportunidad para tener dos tareas al mismo tiempo aquí, lo que podría usar el hilo actual de manera más eficiente! Probablemente el flujo de trabajo se escribiría mejor como:
var ftask = FAsync();
var gtask = GAsync();
x = M(await ftask, await gtask);
Ahora se inician las tareas FAsync y GAsync, y no llamamos a M hasta que ambas finalicen.
Mi consejo es que piense detenidamente dónde pone su espera. Recuerde, una espera está destinada a ser un punto en un flujo de trabajo asíncrono donde el flujo de trabajo se detiene de forma asíncrona hasta que se cumpla una condición previa de la continuación . Si puede retrasar la espera de una tarea hasta que sea realmente una condición previa, es posible que pueda obtener una victoria por rendimiento.
SqlConnectiono, DbContextpor ejemplo.
No hay diferencia de tiempo de ejecución entre;
var results = MapResults(await GetDataAsync())
y
var tmp = await GetDataAsync();
var results = MapResults(tmp)
GetDataAsync) y no la llamada al método. Dependiendo de dónde Task GetDataAsync = CallSomeAsync()se inicialice, podría haber diferencias significativas ya que la tarea ya se estará ejecutando para cuando MapResults(await GetDataAsync)se llame. Vea la respuesta de Eric para más detalles.