C# — Asynchronous Stream (IAsyncEnumerable<T>)

wk
1 min readJul 7, 2020

--

ใน 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

--

--

No responses yet