一尘不染

是否可以“等待收益回报DoSomethingAsync()”

c#

常规迭代器块(即“收益回报”)是否与“异步”和“等待”不兼容?

这样可以很好地说明我要做什么:

async Task<IEnumerable<Foo>> Method(String [] Strs)
{
    // I want to compose the single result to the final result, so I use the SelectMany
    var finalResult = UrlStrings.SelectMany(link =>   //i have an Urlstring Collection 
                   await UrlString.DownLoadHtmlAsync()  //download single result; DownLoadHtmlAsync method will Download the url's html code 
              );
     return finalResult;
}

但是,我收到一个编译器错误,指出“无法从资源加载消息字符串”。

这是另一种尝试:

async Task<IEnumerable<Foo>> Method(String [] Strs)
{
    foreach(var str in strs)
    {
        yield return await DoSomethingAsync( str)
    }
}

但是同样,编译器返回错误:“无法从资源加载消息字符串”。


这是我项目中真正的编程代码

当我有一个列表任务时,这非常有用,该任务可以从URL下载HTML,并且我使用语法“ yield return await
task”,结果是我想要的IEnumerable<Foo>。我不想写这段代码:

async Task<IEnumerable<String>> DownLoadAllURL(String [] Strs)
{
    List<Foo> htmls= new ...
    foreach(var str in strs)
    {
        var html= await DownLoadHtmlAsync( str)
        htmls.Add(item)
    }
    return htmls;
}

但似乎我必须这样做。

谢谢你的帮助。


阅读 231

收藏
2020-05-19

共1个答案

一尘不染

您所描述的内容可以通过该Task.WhenAll方法完成。请注意,代码是如何变成简单的单行代码的。发生的情况是每个单独的url开始下载,然后WhenAll用于将这些操作组合为一个Task可以等待的操作。

Task<IEnumerable<string>> DownLoadAllUrls(string[] urls)
{
    return Task.WhenAll(from url in urls select DownloadHtmlAsync(url));
}
2020-05-19