尝试将 Task.WhenAll 与 Task<string> 一起使用无效

Trying to use Task.WhenAll with Task<string> not working

我正在尝试将多个资源合并到一个集合中(下面的 s 变量)。 GetLocations2 returns 一个任务,我希望能够将其添加到任务结果集合(同样是 s 变量)。但是,由于以下错误,它抱怨我无法将任务结果添加到集合中:

Error CS1503 Argument 1: cannot convert from 'string' to 'System.Threading.Tasks.Task'

打电话

public static async Task<string> WebRequest2(Uri uri)
{
    using (var client = new WebClient())
    {
        var result = await client.OpenReadTaskAsync(uri).ConfigureAwait(false);

        using (var sr = new StreamReader(result))
        {
            return sr.ReadToEnd();
        }
    }
}

来电者

private static async Task GetLocations2()
{
    var s = new List<Task<string>>();

    foreach (var lob in _lobs)
    {
        var r = await Helper.WebRequest2(new Uri(lob));
  
        var x = Helper.DeserializeResponse<SLICS>(r);

        s.Add(r); //Getting red squiggly here
    }

    //var w = await Task.WhenAll();

}

在将任务添加到列表之前不需要 await,它基本上解包由 Helper.WebRequest2 创建的 Task(它还等待 Task 完成,所以原始代码中的任务将按顺序执行):

private static async Task GetLocations2()
{
    var s = new List<Task<string>>();

    foreach (var lob in _lobs)
    {
        var r = Helper.WebRequest2(new Uri(lob));
  
        // var x = Helper.DeserializeResponse<SLICS>(r); this should be done after Task.WhenAll 
        // or using `ContinueWith`

        s.Add(r); 
    }

    var w = await Task.WhenAll(s);

}

您还可以将这两个操作包装在一个 async lambda 中以避免必须迭代两次:

private static async Task GetLocations2()
{
    IEnumerable<SLICS> w = await Task.WhenAll(_lobs.Select(async lob =>
    {
        var r = await Helper.WebRequest2(new Uri(lob));
        return Helper.DeserializeResponse<SLICS>(r);
    }));
}

使用 Select 将枚举所有由 lambda 表达式返回的 Tasks,然后 Task.WhenAll 将等待它们全部完成,然后解包结果。