常规迭代器块(即“yield return”)与“async”和“await”不兼容吗?
这很好地说明了我正在尝试做的事情:
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 wait 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;
}
但看来我必须这么做。
谢谢你的帮助。
您所描述的内容可以通过Task.WhenAll
方法。请注意代码如何变成简单的一行代码。发生的情况是每个单独的网址开始下载,然后WhenAll
用于将这些操作组合成一个Task
这是可以期待的。
Task<IEnumerable<string>> DownLoadAllUrls(string[] urls)
{
return Task.WhenAll(from url in urls select DownloadHtmlAsync(url));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)