C# de los fundamentos al dominio — Lección 8
Construyendo tareas asincrónicas con async y await
Los artículos escritos en este blog fueron creados con el objetivo de enseñar. Además, la información del artículo puede ser incorrecta, así que tenga cuidado.
Bloquear un hilo mientras se espera una operación de red o de archivo también puede congelar la pantalla y otras operaciones. async y await expresan la tarea en espera para que pueda ejecutarse continuamente.
Tarea de regreso
async Task<PlayerData> LoadPlayerAsync(
string url,
CancellationToken cancellationToken)
{
using HttpResponseMessage response =
await httpClient.GetAsync(url, cancellationToken);
response.EnsureSuccessStatusCode();
PlayerData? data = await response.Content
.ReadFromJsonAsync<PlayerData>(cancellationToken);
return data ?? throw new InvalidDataException("Player data is empty");
}
Cuando encuentre espera, puede continuar con el resto de su código más tarde en lugar de aferrarse al hilo actual hasta que finalice la tarea. Los métodos asíncronos básicamente devuelven una tarea para que la persona que llama pueda observar la finalización y el error.
Cancelar Reenviar
using var source = new CancellationTokenSource(TimeSpan.FromSeconds(5));
try
{
PlayerData data = await LoadPlayerAsync(url, source.Token);
}
catch (OperationCanceledException)
{
Console.WriteLine("Loading canceled");
}
Cancelar no es una función que finalice por la fuerza un hilo. Un contrato que solicita una tarea para verificar un token y cancelarla en un punto seguro.
Esperando múltiples tareas
Task<ItemData> itemTask = LoadItemsAsync(token);
Task<QuestData> questTask = LoadQuestsAsync(token);
await Task.WhenAll(itemTask, questTask);
ItemData items = await itemTask;
QuestData quests = await questTask;
Las tareas en espera que no dependen entre sí se pueden iniciar primero y luego esperar juntas. Simplemente marcar un cálculo de CPU como asíncrono no lo convierte automáticamente en paralelo.
flujo para evitar
La espera sincrónica con .Result o .Wait() de Task puede bloquear subprocesos o crear un punto muerto según el entorno de ejecución. Es mejor continuar la ruta de llamada asíncrona en la medida de lo posible.
Se debe evitar async void excepto en los controladores de eventos porque la persona que llama no puede esperar a que se complete y se produzcan excepciones. La clave del código asincrónico no es agregar palabras clave, sino transmitir el flujo de finalización, falla y cancelación a la persona que llama.