常规迭代器块(即“收益回报”)是否与“异步”和“等待”不兼容?
这样可以很好地说明我要做什么:
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>。我不想写这段代码:
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方法完成。请注意,代码是如何变成简单的单行代码的。发生的情况是每个单独的url开始下载,然后WhenAll用于将这些操作组合为一个Task可以等待的操作。
Task.WhenAll
WhenAll
Task
Task<IEnumerable<string>> DownLoadAllUrls(string[] urls) { return Task.WhenAll(from url in urls select DownloadHtmlAsync(url)); }