Czy zwykłe bloki iteratora (np. „Yield return”) są niezgodne z „async” i „await”?
To daje dobre wyobrażenie o tym, co próbuję zrobić:
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;
}
Jednak pojawia się błąd kompilatora, powołujący się na „nie można załadować ciągu wiadomości z zasobów”.
Oto kolejna próba:
async Task<IEnumerable<Foo>> Method(String [] Strs)
{
foreach(var str in strs)
{
yield return await DoSomethingAsync( str)
}
}
Ale znowu kompilator zwraca błąd: „nie można załadować ciągu komunikatów z zasobów”.
Oto prawdziwy kod programistyczny w moim projekcie
Jest to bardzo przydatne, gdy mam zadanie listy, to zadanie można pobrać HTML z adresu URL i używam składni „yield return await task”, czego oczekuję IEnumerable<Foo>
. Nie chcę pisać tego kodu:
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;
}
Ale wydaje się, że muszę.
Dzięki za wszelką pomoc.
IAsyncEnumerator<T>
typu zdefiniowanego przez Arne'a.