Normal yineleme blokları (yani, "getiri dönüşü") "eşzamansız" ve "bekleme" ile uyumsuz mu?
Bu, yapmaya çalıştığım şey hakkında iyi bir fikir veriyor:
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;
}
Ancak, "kaynaklardan ileti dizesi yüklenemedi" ifadesini belirten bir derleyici hatası alıyorum.
İşte başka bir girişim:
async Task<IEnumerable<Foo>> Method(String [] Strs)
{
foreach(var str in strs)
{
yield return await DoSomethingAsync( str)
}
}
Ancak yine, derleyici bir hata döndürür: "kaynaklardan ileti dizesi yüklenemiyor".
İşte projemdeki gerçek programlama kodu
Bu, bir Liste Görevine sahip olduğumda, bu görev bir URL'den HTML indirilebildiğinde ve "getiri dönüş bekleme görevi" sözdizimini kullandığımda çok kullanışlıdır, sonuç istiyorum IEnumerable<Foo>
. Bu kodu yazmak istemiyorum:
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;
}
Ama görünüşe göre mecburum.
Herhangi bir yardım için teşekkürler.
IAsyncEnumerator<T>
Arne tarafından tanımlanan türü kullanırlar .