Потратив некоторое время на работу с C # Tasks
, я нашел способ упростить работу с помощью нескольких методов расширения, вдохновленных функциональным программированием.
Начнем с простого async
вызова и сопоставим результат с другим объектом:
Как показано здесь, нам нужно создать временную переменную только для назначения новому объекту, а это выглядит не очень хорошо.
Мы только хотим создать метод, который преобразует Task<T>
в Task<R>
, передав метод сопоставления в качестве параметра, который отображает (T -> R)
:
Отображение можно упростить, используя Map
method:
Таким образом, мы сможем просто преобразовать 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
работу этими методами.