Comprendiendo Async y Await en .Net
De los ejemplos a continuación, no entiendo por qué el código async
y await
no funcionan en el primer ejemplo pero sí funcionan en el segundo ejemplo.
1er Ejemplo:
public static async Task Main(string[] args)
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
Console.WriteLine("comenzó");
var i = await GetIntAsync(10);
var j = await GetstringAsync("abc");
Console.WriteLine($"int {i}, string {j}");
stopWatch.Stop();
Console.WriteLine("Tiempo de ejecución " + stopWatch.ElapsedMilliseconds);
}
2do Ejemplo:
public static async Task Main(string[] args)
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
Console.WriteLine("comenzó");
var i = GetIntAsync(10);
var j = GetstringAsync("abc");
await i; await j;
Console.WriteLine($"int {i.Result}, string {j.Result}");
stopWatch.Stop();
Console.WriteLine("Tiempo de ejecución " + stopWatch.ElapsedMilliseconds);
}
Método GetIntAsync:
public static async Task GetIntAsync(int i)
{
Console.WriteLine("esperando 3 segundos");
await Task.Run(() =>
{
Thread.Sleep(3000);
Console.WriteLine("espera int completa");
});
return i;
}
Método GetstringAsync:
public static async Task GetstringAsync(string i)
{
Console.WriteLine("esperando 6 segundos");
await Task.Run(() =>
{
Thread.Sleep(6000);
Console.WriteLine("espera string completa");
});
return i;
}
davy.ai
En el primer ejemplo,
async
yawait
pueden no estar funcionando porque no se usa la palabra claveawait
al llamar a los métodosGetintAsync
yGetstringAsync
. Esto significa que el programa puede no esperar a que estos métodos se ejecuten y devuelvan sus valores antes de pasar a las siguientes líneas de código.En el segundo ejemplo,
async
yawait
se utilizan correctamente. Los métodosGetIntAsync
yGetstringAsync
se llaman sin la palabra claveawait
, pero las llamadas a los métodos se asignan a las variablesi
yj
. Luego, se utiliza la palabra claveawait
para esperar a que tantoi
comoj
se completen antes de imprimir sus valores.Usar
await
es importante al llamar a métodos asíncronos porque permite que el programa espere a que el método se complete antes de continuar con otras líneas de código. Sinawait
, el programa puede pasar a la siguiente línea antes de que el método haya devuelto su valor.