asincrona - async await c# ejemplos
¿La asincronía siempre es asincrónica en C#? (1)
Async no siempre es asincrónico. Visual Studio debería mostrar una advertencia de que el primer método no es asincrónico porque no hay nada que esperar.
Este método asíncrono carece de operadores ''en espera'' y se ejecutará de forma síncrona. Considere usar el operador ''await'' para esperar llamadas API sin bloqueo, o ''aguarde Task.Run (...)'' para hacer un trabajo en CPU en un hilo de fondo
Tenga en cuenta que el uso de async void se considera una mala práctica en estos días. Siempre debe usar As taks para el tipo de retorno de los métodos async.
Esta pregunta ya tiene una respuesta aquí:
- C # Async - ¿Cómo funciona? 3 respuestas
Estoy haciendo R & D en async
y estoy a la await
de mi proyecto. Lo que he aprendido es que cuando se llama al método async
, libera el hilo y deja que otros lo utilicen. Podemos establecer la devolución de llamada para el método de await
palabra clave await
y ese método devuelve valor cuando el resultado está listo. Si eso pasa:
- Deberíamos poder acceder a la
UI
brevemente entre las operaciones. - El tiempo de ejecución debe ser más rápido que la llamada al método síncrono habitual.
En mi caso, no tengo dudas sobre el point 1
, pero para el point 2
, el tiempo de ejecución parece ser el mismo que el del método síncrono. Por ejemplo, vea el Sample Code 1
y la Sample Output 1
Código de muestra 1:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Before Async Call");
AsyncMethod();
Console.WriteLine("After Async Call");
Console.ReadLine();
}
public async static void AsyncMethod()
{
var firstValue = FirstAsyncMethod("FirstAsyncMethod has been called");
Console.WriteLine("Middle of FirstAsyncMethod and SecondAsyncMethod");
var secondValue = SecondAsyncMethod("SecondAsyncMethod has been called");
Console.WriteLine(await firstValue);
Console.WriteLine(await secondValue);
}
public static async Task<string> FirstAsyncMethod(string value)
{
for (int i = 0; i < 500000000; i++)
{
i = i + 1 - 1;
}
return "Success: "+value;
}
public static async Task<string> SecondAsyncMethod(string value)
{
for (int i = 0; i < 500000000; i++)
{
i = i + 1 - 1;
}
return "Success: " + value;
}
}
Muestra de salida 1:
Before Async Call
Middle of FirstAsyncMethod and SecondAsyncMethod
Success: FirstAsyncMethod has been called
Success: SecondAsyncMethod has been called
After Async Call
Pero si llamo al método async
con Task.Run(()=> )
(Por ejemplo, Sample Code 2
y Sample Output 2
), reduce el tiempo de ejecución en comparación con el primer ejemplo ( Sample Code 1
).
Código de muestra 2:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Before Async Call");
AsyncMethod();
Console.WriteLine("After Async Call");
Console.ReadLine();
}
public async static void AsyncMethod()
{
var firstValue =Task.Run(()=> FirstAsyncMethod("FirstAsyncMethod has been called"));
Console.WriteLine("Middle of FirstAsyncMethod and SecondAsyncMethod");
var secondValue = Task.Run(() => SecondAsyncMethod("SecondAsyncMethod has been called"));
Console.WriteLine(await firstValue);
Console.WriteLine(await secondValue);
}
public static async Task<string> FirstAsyncMethod(string value)
{
for (int i = 0; i < 500000000; i++)
{
i = i + 1 - 1;
}
return "Success: "+value;
}
public static async Task<string> SecondAsyncMethod(string value)
{
for (int i = 0; i < 500000000; i++)
{
i = i + 1 - 1;
}
return "Success: " + value;
}
}
Muestra de salida 2:
Before Async Call
Middle of FirstAsyncMethod and SecondAsyncMethod
After Async Call
Success: FirstAsyncMethod has been called
Success: SecondAsyncMethod has been called
Mi pregunta es, ¿por qué el primer ejemplo ( Sample Code 1
) toma tiempo como una llamada al método sincrónico?