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

时间:2018-09-26 20:28:41

标签: c# task-parallel-library

我想对数据库执行多个非链接结果,所以我正在使用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自变量?

1 个答案:

答案 0 :(得分:3)

不幸的是,无法拥有可变数量的泛型类型参数。像ActionTuple这样的实例具有多达8个左右泛型的单独定义。

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

IE。

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