【发布时间】:2018-05-07 15:03:58
【问题描述】:
借助“无处不在的异步”,触发多个异构操作的能力变得越来越频繁。当前的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 个参数的单独方法。根据this answer,这只是使用泛型的限制。此实现也有一个限制,即不能支持返回 void 的任务,但这不是问题。
我的问题是:任何即将推出的语言功能是否允许更简洁的方法来解决这个问题?
【问题讨论】:
-
你的
WhenAll重载可以重写为public static async Task<(TA a, TB b)> WhenAll<TA, TB>(Task<TA> operation1, Task<TB> operation2) { return (await operation1, await operation2); }这避免了创建一段时间的新对象,一堆演员,并且更容易阅读。 (并且它会随着您增加对象而扩大)。 -
@BatteryBackupUnit 在第一个操作完成之前不会开始第二个操作。
-
@NeilMacMullen 当您到达新方法的主体时,任务已经在运行(您接受任务,而不是产生任务的函数),因此即使您当时试过。
WhenAll根本没有引入并行性。它只是创建一个新任务,在完成所有提供的任务后完成。依次等待所有的人做同样的事情。
标签: c# asynchronous task c#-8.0