В асинхронном программировании на C# эффективное управление несколькими асинхронными операциями является общим требованием. Метод Task.WhenAll — мощный инструмент для одновременного выполнения нескольких задач и ожидания их завершения. В этом подробном руководстве мы рассмотрим использование Task.WhenAll с подробными примерами, которые помогут вам понять, как он работает и когда его эффективно использовать в асинхронном коде C#.

Понимание Task.WhenAll

Task.WhenAll — это статический метод, предоставляемый классом Task в C#. Он позволяет одновременно выполнять несколько задач и асинхронно ожидать их завершения. Он принимает массив задач и возвращает новую задачу, которая завершается, когда все входные задачи завершены или когда какая-либо из них генерирует исключение.

Подпись Task.WhenAll выглядит следующим образом:

public static Task WhenAll(params Task[] tasks);

Использование Task.WhenAll с примерами

Пример 1. Параллельное выполнение задач

async Task Example1Async()
{
    var task1 = Task.Delay(2000); // Simulate a 2-second task
    var task2 = Task.Delay(3000); // Simulate a 3-second task
    await Task.WhenAll(task1, task2);
    Console.WriteLine("Both tasks have completed.");
}

В этом примере у нас есть две задачи, task1 и task2, каждая из которых имитирует задержку. Используя Task.WhenAll, мы можем одновременно дождаться завершения обеих задач. Это полезно, когда у вас есть независимые задачи, которые могут выполняться параллельно, не дожидаясь друг друга.

Пример 2: Обработка исключений

async Task Example2Async()
{
    var task1 = Task.Run(() => throw new InvalidOperationException("Task 1 failed."));
    var task2 = Task.Delay(3000);
    try
    {
        await Task.WhenAll(task1, task2);
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Exception: {ex.Message}");
    }
}

В этом примере task1 намеренно генерирует исключение, а task2 представляет собой задачу задержки. Если при использовании Task.WhenAll какая-либо из входных задач выдает исключение, результирующая задача также выдаст исключение. Мы перехватываем исключение и обрабатываем его соответствующим образом.

Пример 3. Выполнение нескольких HTTP-запросов

async Task<string[]> Example3Async()
{
    var httpClient = new HttpClient();
    var url1 = "https://example.com/api/data1";
    var url2 = "https://example.com/api/data2";
    var task1 = httpClient.GetStringAsync(url1);
    var task2 = httpClient.GetStringAsync(url2);
    var results = await Task.WhenAll(task1, task2);
    return results;
}

В этом примере мы используем Task.WhenAll для одновременного выполнения нескольких HTTP-запросов к разным URL-адресам. Метод GetStringAsync возвращает Task<string>, и мы используем Task.WhenAll, чтобы дождаться одновременного завершения обоих запросов. Это распространенный сценарий в веб-приложениях, когда вам необходимо одновременно получать данные из нескольких источников.

Заключение

Task.WhenAll — ценный инструмент для управления несколькими асинхронными задачами на C#. Это позволяет эффективно запускать задачи одновременно и ожидать их завершения, делая асинхронный код более отзывчивым и производительным. Поняв, как эффективно использовать Task.WhenAll, вы сможете писать эффективный и отзывчивый асинхронный код в своих приложениях C#.

Стеккадемический

Спасибо, что дочитали до конца. Прежде чем уйти:

  • Пожалуйста, рассмотрите возможность аплодировать и следовать автору! 👏
  • Следуйте за нами в Twitter(X), LinkedIn и YouTube.
  • Посетите Stackademic.com, чтобы узнать больше о том, как мы демократизируем бесплатное образование в области программирования во всем мире.