Потратив некоторое время на работу с C # Tasks, я нашел способ упростить работу с помощью нескольких методов расширения, вдохновленных функциональным программированием.

Начнем с простого async вызова и сопоставим результат с другим объектом:

Как показано здесь, нам нужно создать временную переменную только для назначения новому объекту, а это выглядит не очень хорошо.

Мы только хотим создать метод, который преобразует Task<T> в Task<R>, передав метод сопоставления в качестве параметра, который отображает (T -> R):

Отображение можно упростить, используя Mapmethod:

Таким образом, мы сможем просто преобразовать Task<T> в Task<R> с помощью одного выражения и без дополнительного присвоения временной переменной.

Идя дальше, вы можете посмотреть, как мы можем связать несколько Tasks:

У нас есть Task<Task<R>> вместо Task<R>, потому что наш метод сопоставления возвращает Task<R> вместо R, как мы видели в предыдущем примере.
Итак, нам нужен сглаженный результат функции, это тот момент, когда на сцену выходит метод Bind.

Вот реализация метода Bind:

Как видите, ничего сложного здесь нет. Нам следует использовать Map, когда мы хотим просто преобразовать результат Task<T> в другой тип и использовать Bind для связывания нескольких задач. В C # Map и Bind уже реализованы как часть LINQ. Функции сопоставления с IEnumerable<T> интерфейсом реализованы как методы расширения и имеют имена Select и SelectMany.

Далее я собираюсь поговорить о Task.WhenAll.. Этот метод асинхронно ожидает нескольких асинхронных операций, которые представлены в виде набора задач и используются для повышения производительности, когда операции не зависят друг от друга. Но получить доступ к результатам этих задач не очень хорошо. Давайте посмотрим на пример:

Как видно, нам нужны дополнительные переменные для хранения задач, затем вызывается Task.WhenAll method, и после этого мы знаем, что все задачи завершены, и мы можем получить доступ к их значениям с помощью ключевого слова await или свойства Result.

Я создал оболочку для Task.WhenAll метода с определенным количеством параметров, которая возвращает результаты задач в виде ValueTuple.

Использование метода TaskHeper.WhenAll:

Используйте Map, чтобы написать предыдущий пример более элегантно:

Я надеюсь, что вы нашли эту статью полезной и упростили свою Tasks работу этими методами.