Sobes.tech
Middle

¿Cómo funciona el mecanismo async/await en C#?

sobes.tech AI

Respuesta de la IA

El mecanismo async/await permite escribir código asíncrono que parece sincrónico.

  1. Palabra clave async: Marca un método como asíncrono. Tal método puede contener la instrucción await.
  2. Palabra clave await: Se usa antes de llamar a una operación asíncrona (generalmente un método que devuelve Task o Task<T>). Cuando la ejecución llega a await, el control se devuelve al método que lo llamó, y el hilo liberado puede realizar otra tarea.
  3. Task / Task<T>: Representa una promesa de completar una operación asíncrona y su resultado (para Task<T>). await "espera" a que esta "promesa" se complete.
  4. Máquina de estados: El compilador transforma el método asíncrono en una máquina de estados. Esta máquina guarda el estado del método al llegar a await.
  5. Continuación: Cuando la tarea esperada se completa, el entorno de ejecución programa la ejecución de la parte restante del método asíncrono (la continuación) en un hilo del pool o en el mismo contexto de sincronización si está capturado.
  6. Retorno del control: Tras completar la operación asíncrona, el control regresa al punto después de await, y la ejecución del método continúa con el estado guardado.
// Método asíncrono
async Task<int> GetLengthAsync(string url)
{
    // Crear cliente HTTP
    using var client = new HttpClient(); 
    // Realizar solicitud asíncrona a la URL
    // Await espera la finalización de la solicitud sin bloquear el hilo
    string content = await client.GetStringAsync(url); 
    // La continuación se ejecuta después de obtener el contenido
    return content.Length; 
}

// Uso del método asíncrono
async void Button_Click(object sender, EventArgs e)
{
    // Await espera a que GetLengthAsync termine
    // El hilo de la interfaz de usuario no se bloquea
    int length = await GetLengthAsync("https://example.com"); 
    // Actualizar elemento de la interfaz
    Label1.Text = $"Longitud del contenido: {length}"; 
}