是否可以使用新的C#语言功能来清理Task.WhenAll语法?

时间:2018-05-07 15:03:59

标签: c# asynchronous task c#-8.0

随着“无处不在”,启动多个异构操作的能力变得越来越频繁。当前的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个参数的单独方法。根据{{​​3}},这只是使用泛型的限制。此实现还有一个限制,即无法支持返回void的任务,但这不是一个问题。

我的问题是:是否有任何即将推出的语言功能可以更清晰地解决这个问题?

1 个答案:

答案 0 :(得分:3)

open feature-request上有一个dotnet/csharplang repository

该问题还提到了另一个开放功能请求,tuple splatting在某种程度上可能有所帮助。如何解释here

这两个问题目前都标记为[讨论]和[功能请求],并且已经空闲&#34;现在一年(2017年5月 - 2018年5月)。

因此,我推断答案(目前)是&#34; no&#34;。