¿Es asíncrono siempre asíncrono en C #? [duplicar]
Esta pregunta ya tiene una respuesta aquí:
C # Async: ¿cómo funciona? 3 respuestasEstoy haciendo I + D enasync
yawait
para mi proyecto Lo que he aprendido es que cuandoasync
Se llama al método, libera el hilo y permite que otros lo usen. Podemos configurar la devolución de llamada para el método de espera usandoawait
palabra clave y ese método devuelve valor cuando el resultado está listo. Si eso pasa:
UI
brevemente entre 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 sobrepoint 1
, Pero parapoint 2
, su tiempo de ejecución parece lo mismo que la llamada al método síncrono. Por ejemplo verSample Code 1
ySample 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;
}
}
Salida de muestra 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 alasync
método conTask.Run(()=> )
(Por ejemploSample Code 2
ySample 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;
}
}
Salida de muestra 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
) tomando tiempo como llamada al método sincrónico?