async/await ใน .NET Core 2.0

ไอเดียของ async/await มันทำงานอยู่บน promise ช่วยให้เราสามารถเขียนโค้ดที่เป็น asynchronous ได้ในแบบสไตล์ synchronous

ใน .NET Core ใช้ Task และ Task<T> เป็นตัวแทนของ promise โดยที่ Task คือ operation ที่ไม่ได้มีการ return ค่าอะไร ส่วน Task<T> จะเป็น operation ที่มีการ return ค่าที่มี type T

โค้ดข้างล่างนี่ เป็น asynchronous function ที่ return promise ที่พอ resolve แล้วจะได้ค่าที่มี type เป็น string

public Task<string> GetHtmlAsync()
{
    // Execution is synchronous here
    var client = new HttpClient();

    return client.GetStringAsync("http://www.dotnetfoundation.org");
}

นั่นคือ ถ้าเราใช้โค้ดด้านบน เมื่อเราเรียก GetHtmlAsync() แสดงว่า เราจะต้องเป็นคนจัดการ Task ที่ return กลับไปต่อเอง

ส่วนโค้ดถัดมา เอา async/await มาใช้

public async Task<string> GetFirstCharactersCountAsync(string url, int count)
{
    // Execution is synchronous here
    var client = new HttpClient();

    // Execution of GetFirstCharactersCountAsync() is yielded to the caller here
    // GetStringAsync returns a Task<string>, which is *awaited*
    var page = await client.GetStringAsync("http://www.dotnetfoundation.org");

    // Execution resumes when the client.GetStringAsync task completes,
    // becoming synchronous again.

    if (count > page.Length)
    {
        return page;
    }
    else
    {
        return page.Substring(0, count);
    }
}

จะเห็นว่า ตอน client.GetStringAsync() มีการสั่ง await ไว้เพื่อรอให้คำสั่งนี้ทำเสร็จก่อน เมื่อทำเสร็จแล้วค่าที่ได้จะถูกส่งกลับมาให้ที่ตัวแปร page ส่วนที่แตกต่างกับ synchronous คือ ถ้าคำสั่ง GetString() เป็น synchronous แสดงว่า ตรงนี้จะเกิด thread blocking และจะ block ไปจนกว่าจะได้ค่ากลับมาให้ page แต่ async/await เป็น asynchronous นั่นหมายถึง คำสั่ง await client.GetStringAsync() จะเป็น non-blocking แต่แค่รอเฉย ๆ เมื่อได้ค่ากลับมาแล้วค่อยไปทำงานตามปกติต่อไป

ข้อดีของการใช้ async/await

  1. code จะสะอาด และอ่านง่ายขึ้น ไม่มี callback hell ไม่มี explicit promise ที่ต้องไป handle กันเองอีกต่อไป
  2. ได้ค่าที่เอากลับไปใช้ได้เลย ไม่ใช่ได้ promise (Task) กลับไปใช้ แล้วต้องไปจัดการกันต่อเองอีก
  3. debug ได้ง่ายขึ้น เพราะ code มัน flat ลง ไม่ต้องกระโดดไปกระโดดมาหาพวก callback อีก
  4. ฯลฯ

ดูโอเคเนอะ

Leave a Reply