programacion ejemplos await async asincrona c# multithreading async-await task

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.

Ver este artículo para más información

Esta pregunta ya tiene una respuesta aquí:

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:

  1. Deberíamos poder acceder a la UI brevemente entre las operaciones.
  2. 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?