Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

Async และ Await ใน C#

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 ตอนเสร็จ
}

หลักการทำงาน

  1. async บอก Compiler ว่า Method นี้มี Await ข้างใน
  2. await หยุด Method ชั่วคราว คืน Control ให้ Caller
  3. เมื่อ Task เสร็จ → Resume ตำแหน่งถัดจาก await

กฎสำคัญ

  • Method ที่มี await ต้องมี async modifier
  • Return type ต้องเป็น Task, Task<T>, ValueTask<T> หรือ void (เฉพาะ Event handler)
  • หลีกเลี่ยง async void ยกเว้น Event handlers
  • ใช้ ConfigureAwait(false) ใน Library code เพื่อไม่ Capture SynchronizationContext

ตัวอย่างสมบูรณ์

public async Task DownloadAsync(string url) {
    using (HttpClient client = new HttpClient()) {
        string result = await client.GetStringAsync(url);
        return result;
    }
}

// เรียกใช้
string html = await DownloadAsync("https://example.com");