Saltar al contenido

Entendiendo el flujo de control con Async y Await en C#

Recordarán que en la guía anterior, la palabra clave “async” es en realidad sólo una forma de eliminar la ambigüedad para el compilador con respecto a la espera. Así que, cuando hablamos del enfoque asíncrono/espera, es realmente la palabra clave espera la que hace todo el trabajo pesado. Pero antes de ver lo que hace await, hablemos de lo que hace no .

La palabra clave “esperar” no bloquea el hilo actual. ¿Qué queremos decir con eso? Veamos algunos ejemplos de código de bloqueo.

Entendiendo el flujo de control con Async y Await en C#
Entendiendo el flujo de control con Async y Await en C#
1System.Threading.Thread.Sleep(1000);

csharp

El código anterior bloquea la ejecución del hilo actual durante un segundo. Otros hilos de la aplicación pueden continuar ejecutándose, pero el hilo actual no hace absolutamente nada hasta que la operación de dormir se haya completado. Otra forma de describirlo es que el hilo espera de forma sincronizada. Ahora, para otro ejemplo, esta vez de la Librería Paralela de Tareas:

123var httpClient =newHttpClient();var myTask = client.GetStringAsync("https://...");var myString = myTask.GetAwaiter().GetResult();

csharp

En el fragmento de código anterior, la clase HttpClient de .NET devuelve una instancia de la tarea, pero llamamos a GetAwaiter().GetResult() en la tarea, lo cual es una llamada de bloqueo. De nuevo, esto es síncrono; no se producirá ninguna ejecución en el hilo actual hasta que GetResult regrese con los datos devueltos por la operación (los datos de la cadena solicitada en este ejemplo). De forma similar, la propiedad Result de una tarea también se bloquea de forma síncrona hasta que se devuelven los datos.

Por último, pero no menos importante, también hay un método de espera que está bloqueando, por ejemplo:

1myTask.Wait();

csharp

Incluso si la tarea subyacente es asíncrona, si llama a un método de bloqueo o a una propiedad de bloqueo en la tarea, la ejecución esperará a que la tarea se complete, pero lo hará de forma sincrónica, de modo que el hilo actual esté completamente ocupado durante la espera. Por lo tanto, si usas una de las propiedades/métodos anteriores, asegúrate de que eso es realmente lo que querías hacer.

La palabra clave de la espera, por el contrario, es no bloqueante , lo que significa que el hilo actual es libre de hacer otras cosas durante la espera. Pero, ¿qué más podría estar haciendo el hilo actual?