Благодаря «асинхронности повсюду» возможность запуска нескольких неоднородных операций становится все более частой. Текущий метод 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 параметров. Согласно этот ответ является ограничением использования дженериков. Эта реализация также имеет ограничение, заключающееся в том, что Задачи, возвращающие пустые места, не могут поддерживаться, но это менее важно.
У меня вопрос: позволяют ли какие-либо из следующих языковых функций более понятный подход к этому?