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