从 Task.WhenAll 获取结果的通用方法

Universal method to get results from Task.WhenAll

我想对数据库执行多个非链接结果,所以我使用 Task.WhenAll 来获取数据。我有辅助方法:

public static async Task<(T1, T2)> WhenAll<T1, T2>(Task<T1> task1, Task<T2> task2)
{
     await Task.WhenAll(task1, task2);
     var result1 = await task1;
     var result2 = await task2;
     return (result1, result2);
 }

用法:

var (profile, roles) = await AsyncUtils.WhenAll(
    _repository.GetUserProfile(userId),
    _repository.GetUserRoles(userId)
);

是否可以重写此方法以接收 3、4、5 个参数?

不幸的是,没有办法拥有可变数量的泛型类型参数。像 Action and Tuple 这样的实例有最多 8 个左右泛型的单独定义。

支持任意长度的泛型将是语言的重大变化。

I.E.

public static async Task<(T1, T2)> WhenAll<T1, T2>(Task<T1> task1, Task<T2> task2)
{
  await Task.WhenAll(task1, task2);
  return (task1.Result, task2.Result);
}

public static async Task<(T1, T2, T3)> WhenAll<T1, T2, T3>(Task<T1> task1, Task<T2> task2, Task<T3> task3)
{
  await Task.WhenAll(task1, task2, task3);
  return (task1.Result, task2.Result, task3.Result);
}

... etc for how ever many generics you want to support