async/await ใช้สำหรับ Asynchronous Programming ทำให้โค้ด Non-blocking เขียนง่าย อ่านง่าย คล้าย Synchronous code
ปัญหาของ Synchronous Code (GUI App)
// Blocking - UI ค้างจน Download เสร็จ
private void OnRequestDownload(object sender, RoutedEventArgs e) {
var req = HttpWebRequest.Create(_requestedUri);
var res = req.GetResponse(); // Block here!
}
แก้ด้วย async/await
// Non-blocking - UI ตอบสนองได้
private async void OnRequestDownload(object sender, RoutedEventArgs e) {
var req = HttpWebRequest.Create(_requestedUri);
var res = await req.GetResponseAsync(); // Yield control, resume ตอนเสร็จ
}
หลักการทำงาน
asyncบอก Compiler ว่า Method นี้มี Await ข้างในawaitหยุด Method ชั่วคราว คืน Control ให้ Caller- เมื่อ Task เสร็จ → Resume ตำแหน่งถัดจาก await
กฎสำคัญ
- Method ที่มี await ต้องมี
asyncmodifier - Return type ต้องเป็น
Task,Task<T>,ValueTask<T>หรือvoid(เฉพาะ Event handler) - หลีกเลี่ยง
async voidยกเว้น Event handlers - ใช้
ConfigureAwait(false)ใน Library code เพื่อไม่ Capture SynchronizationContext
ตัวอย่างสมบูรณ์
public async TaskDownloadAsync(string url) { using (HttpClient client = new HttpClient()) { string result = await client.GetStringAsync(url); return result; } } // เรียกใช้ string html = await DownloadAsync("https://example.com");