ฉันต้องการแก้ไขโปรแกรมที่มีอยู่และมันมีรหัสต่อไปนี้:
var inputs = events.Select(async ev => await ProcessEventAsync(ev))
.Select(t => t.Result)
.Where(i => i != null)
.ToList();
แต่สิ่งนี้ดูแปลกสำหรับฉันมากก่อนอื่นให้ใช้async
และawait
เลือก ตามคำตอบของสตีเฟ่นเคลียร์ฉันควรจะทิ้งมันไว้
จากนั้นวินาทีSelect
ที่เลือกผลลัพธ์ นี่ไม่ได้หมายความว่างานนั้นไม่ได้เป็นแบบอะซิงก์เลยและดำเนินการแบบซิงโครนัส (ไม่ต้องใช้ความพยายามมากนัก) หรืองานนั้นจะทำงานแบบอะซิงโครนัส
ฉันควรเขียนโค้ดด้านบนเหมือนดังต่อไปนี้ตามคำตอบอื่นโดย Stephen Cleary :
var tasks = await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev)));
var inputs = tasks.Where(result => result != null).ToList();
และมันเหมือนกันหมดอย่างนี้หรือไม่?
var inputs = (await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev))))
.Where(result => result != null).ToList();
ในขณะที่ฉันกำลังทำงานในโครงการนี้ฉันต้องการเปลี่ยนตัวอย่างโค้ดแรก แต่ฉันไม่กระตือรือร้นที่จะเปลี่ยนโค้ด async (ทำงานได้อย่างมั่นใจ) บางทีฉันแค่กังวลอะไรและตัวอย่างโค้ดทั้ง 3 ทำสิ่งเดียวกันหรือไม่
ProcessEventsAsync มีลักษณะเช่นนี้:
async Task<InputResult> ProcessEventAsync(InputEvent ev) {...}
Task<InputResult>
มีInputResult
เป็นชั้นเอง
Select
Where
Result
คุณสมบัติของงาน