ฉันต้องการจัดการคอลเลคชันควบคู่กันไป แต่ฉันประสบปัญหาในการใช้งานจึงหวังว่าจะได้รับความช่วยเหลือ
ปัญหาเกิดขึ้นถ้าฉันต้องการเรียกวิธีการที่ทำเครื่องหมาย async ใน C # ภายในแลมบ์ดาของลูปขนาน ตัวอย่างเช่น:
var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, async item =>
{
// some pre stuff
var response = await GetData(item);
bag.Add(response);
// some post stuff
}
var count = bag.Count;
ปัญหาเกิดขึ้นกับการนับเป็น 0 เนื่องจากเธรดทั้งหมดที่สร้างขึ้นมีประสิทธิภาพเป็นเพียงเธรดพื้นหลังและการParallel.ForEach
โทรไม่รอให้เสร็จสิ้น หากฉันลบคีย์เวิร์ด async วิธีการจะมีลักษณะดังนี้:
var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, item =>
{
// some pre stuff
var responseTask = await GetData(item);
responseTask.Wait();
var response = responseTask.Result;
bag.Add(response);
// some post stuff
}
var count = bag.Count;
มันใช้งานได้ แต่มันปิดใช้งานความฉลาดรอคอยอย่างสมบูรณ์และฉันต้องจัดการข้อยกเว้นด้วยตนเอง .. (ลบออกเพื่อความกะทัดรัด)
ฉันจะใช้Parallel.ForEach
ลูปที่ใช้คีย์เวิร์ด await ภายในแลมบ์ดาได้อย่างไร เป็นไปได้ไหม?
ต้นแบบของเมธอด ParallelForEach ใช้Action<T>
เป็นพารามิเตอร์ แต่ฉันต้องการให้มันรอแลมด้าแบบอะซิงโครนัสของฉัน
await
จากawait GetData(item)
ในบล็อกโค้ดที่สองของคุณเนื่องจากจะทำให้เกิดข้อผิดพลาดในการคอมไพล์ตามที่เป็นอยู่