Close
AlgoliaLogoLight
Close full mode
logo

Async/Await

Git RepositoryEdit on Github

Async/Await checklist

Please make sure you have done these checklist items when working with asynchronous programming.

Async/Await basic knowledge

  • การใช้ async/await เมื่อคอมไพล์โค้ดจะสร้าง method นั้นเป็น class ที่ implement อินเตอร์เฟซ IAsyncStateMachine
  • การใช้ async/await จะสร้าง Handler exception ที่ถูก throw ออกมาจาก method นั้นได้ หากไม่มี async/await เมื่อเกิดข้อผิดพลาด exception จะหายไป
  • ใช้ await Task.WhenAll() ก็ต่อเมื่อต้องการควบคุมการทำของของ Task เอง เช่น สร้าง Task มาหลาย Task ใน array แล้วต้องการให้รอทุก Task เสร็จพร้อมกันก่อน แล้วจึงไปต่อแทนการ await ทุก Task ด้วยตัวเอง
  • เมื่อใช้ async/await ไม่จำเป็นต้องเกิด thread ใหม่เสมอ
  • หาก Implement อินเตอร์เฟซที่ส่งผลลัพธ์เป็น Task<Result> แต่ว่าใน method ไม่มี async/await เราสามารถคืนค่าด้วยการใช้ Task.FromResult(return_value);
  • Task.WaitAll() จะรอทุกงานให้เสร็จก่อน (block context thread) แล้วจึงดำเนินการต่อ แต่ว่า Task.WhenAll() จะคืนค่าเป็น Task สามารถไปสั่ง await ที่อื่นได้อีกที
  • การรัน Task โดยไม่ await ในบางแอปพลิเคชัน เช่น ASP.NET Core จะไม่นำไปสู่ Fire and Forget คือสั่งแล้วลืมไปได้เลยเดี๋ยวงานก็เสร็จ แต่จะได้ผลลัพธ์เป็น สั่งแล้วงานหายไปเลย เพราะตัว ASP.NET Core MVC's controller จะถูก dispose หลังจากที่ได้ process HTTP response เรียบร้อยแล้ว ดังนั้น Task ที่ยังทำงานไม่เสร็จก็จะหายไปด้วย
  • หาก Task ที่สั่งมีระยะเวลาในการทำงานที่ยาว และไม่ต้องการไปแย่ง Thread จาก pool เราสามารถบอก Scheduler ได้ว่างานนี้จะทำงานยาวๆ ด้วยพารามิเตอร์ TaskCreationOptions.LongRunning จากคำสั่ง Task.Factory.StartNew(Func<>(), TaskCreationOptions.LongRunning);
Loading comments...