บล็อกตัวทำซ้ำปกติ (เช่น "ผลตอบแทน") ไม่เข้ากันกับ "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)
}
}
แต่อีกครั้งคอมไพลเลอร์ส่งกลับข้อผิดพลาด: "ไม่สามารถโหลดสตริงข้อความจากทรัพยากร"
นี่คือรหัสการเขียนโปรแกรมจริงในโครงการของฉัน
นี้จะเป็นประโยชน์อย่างมากเมื่อฉันมีรายการงานงานที่สามารถดาวน์โหลด HTML จาก URL และผมใช้ไวยากรณ์ "อัตราผลตอบแทนกลับมางานที่รอคอย" 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;
}
แต่ดูเหมือนว่าฉันจะต้อง
ขอบคุณสำหรับความช่วยเหลือ
IAsyncEnumerator<T>
ประเภทตามที่ Arne กำหนด