В асинхронном программировании на 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, чтобы узнать больше о том, как мы демократизируем бесплатное образование в области программирования во всем мире.