Async/Await
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...