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

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

ดูโอเคเนอะ

Leave a Reply

Your email address will not be published. Required fields are marked *