Можно ли использовать новые функции языка C # для очистки синтаксиса Task.WhenAll? - PullRequest
0 голосов
/ 07 мая 2018

Благодаря «асинхронности повсюду» возможность запуска нескольких неоднородных операций становится все более частой. Текущий метод Task.WhenAll возвращает результаты в виде массива и требует, чтобы все задачи возвращали один и тот же тип объекта, что делает его использование немного неуклюжим. Я бы хотел бы , чтобы иметь возможность писать ...

var (i, s, ...) = await AsyncExtensions.WhenAll(
                          GetAnIntFromARemoteServiceAsync(),
                          GetAStringFromARemoteServiceAsync(),
                          ... arbitrary list of tasks   
                         );
Console.WriteLine($"Generated int {i} and string {s} ... and other things");

Лучшая реализация, которую я смог придумать, это

public static class AsyncExtensions
{
  public static async Task<(TA , TB )> WhenAll<TA, TB>(Task<TA> operation1, Task<TB> operation2)
  {
             return (await operation1, await operation2;
  }
}

Это имеет тот недостаток, что мне нужно реализовать отдельные методы до N параметров. Согласно этот ответ является ограничением использования дженериков. Эта реализация также имеет ограничение, заключающееся в том, что Задачи, возвращающие пустые места, не могут поддерживаться, но это менее важно.

У меня вопрос: позволяют ли какие-либо из следующих языковых функций более понятный подход к этому?

1 Ответ

0 голосов
/ 07 мая 2018

Для этого есть открытый запрос объектов для этого в dotnet / csharplang репозитории .

В этой проблеме также упоминается еще один запрос на открытую функцию, разделение кортежей , которое может в некоторой степени помочь. Как, объяснено здесь .

Обе проблемы в настоящее время помечены как [Обсуждение] и [Запрос на добавление функций] и находятся в состоянии ожидания в течение года (май 2017 года - май 2018 года).

Следовательно, я бы сделал вывод, что ответ (в настоящее время) "нет".

...