ใน C# 8 มี Interface ใหม่ชื่อ IAsyncEnumerable
สำหรับสร้าง Asynchronous stream ที่ต้องรอข้อมูลแต่ละ Element ด้วย await
ดังนั้น เพื่อให้การประมวลผลทำได้ง่าย ในเวอร์ชัน 8 นี่จึงมีการเพิ่ม Syntax await foreach
เข้ามาด้วย
ตัวอย่าง
ฟังก์ชัน GetStringValues()
รีเทิร์น IAsyncEnumerable<Data>
ซึ่งเป็น Asynchronous stream
ในการประมวลผล Stream แต่ละ Element สามารถใช้ Syntax await foreach
ดังนี้
แต่เนื่องจากคุณสมบัติของ Stream เราไม่มีทางรู้ว่า Stream จะจบเมื่อไหร่ Stream อาจส่งข้อมูลออกมาเรื่อย ๆ จนกว่าโปรแกรมจะหยุดทำงานก็เป็นไปได้ ดังนั้น IAsyncEnumerable
จึงไม่มีฟังก์ชันสำหรับแปลง Stream เป็น List เช่น ToListAsync()
มาให้
ตัวอย่างนี้ เป็นวิธีเขียน Extensions ใหักับ IAsyncEnumerable
ประกอบด้วย ฟังก์ชัน ToListAsync
และ GetAwaiter
เพื่อให้สามารถแปลง Stream เป็น List หรือใช้ await โดยตรงจาก IAsyncEnumerable
เพื่อให้ได้ข้อมูลทั้งหมดจาก Stream ในครั้งเดียว
จาก Extensions ทำให้สามารถใช้ await generator.GetStringValue()
และ GetStringValue().ToListAsync()
ได้ โดยไม่ต้องดึงข้อมูลแต่ละ Element ผ่าน async foreach