top of page

[C#] วิธีจำกัดจำนวน Tasks ที่ Run อยู่พร้อมๆกันบน .NET Application

ในการพัฒนา Application โดยมีการใช้ Task จำนวนมากๆ นั้นอาจทำให้เกิดการกิน memory ในจำนวนมากถ้าไม่มีการจัดการที่ดีมากนัด เพราะในช่วง run time เราไม่อาจจะทราบว่า Application ที่พัฒนาไว้นั้นมีการสร้าง Task ซ้ำกันจำนวนเท่าไร ซึงอาจจะส่งผลให้ Application ทำงานผิดพลาดแบบไม่ทราบสาเหตุหรือทำให้เครื่องที่ run อยู่ช้าและ Hang ไปในที่สุด บทความนี้จะแนะนำเทคนิคการจำกัดจำนวนของ Task ให้ Active ตามจำนวนที่เรากำหนดได้

System.Threading.SemaphoreSlim

เป็น light-weight class ที่ใช้สำหรับบริหารจัดการจำนวนของ Task ที่เกิดขึ้นในช่วงเวลาพร้อมๆ กันบน Application ซึ่ง class นี้จะ support ตั้งแต่ .NET Framework 4.0 เป็นต้นไป

ตัวอย่างการใช้งาน System.Threading.SemaphoreSlim

เมื่อ run code ดูจะเห็นว่า Task จะถูก execute เพียง 2 task ในช่วงเดียวกันเท่านั้น จากการกำหนดค่าใน SemaphoreSlim ในส่วนของ Method SemaphoreSlim.Wait จะทำหน้าที่ block task อื่นไม่ให้ execute จนกว่า task ที่ allow ให้ execute จะทำงานเสร็จค่อย execute task ต่อไปโดยมีโควต้าให้ execute ได้รอบละ 2 tasks ไปเรื่อยๆ แต่ถ้าหากต้องการให้ process run ตลอดเวลาแบบไม่ต้องมีการรอสามารถสร้าง wait timeout ให้ task นั้นได้โดยเขียนแบบด้านล่าง

Result

เมื่อ run code ดูจะเห็นว่า task index 2 จะ timeout ออกไปเนื่องจาก task 0 และ 1 ยังไม่ finish หรือยังไม่ semaphoreSlim.Release ซึ่งจากรูปจะกำหนด timeout ให้รอได้แค่ 3 sec ที่ SemaphoreSlim.Wait พอ task 0 หรือ task 1 finish จะข้ามมา execute ที่ task 3 และ task 4 เลย พอถึงคิวของ task index 5 ก็จะรอ 3 sec เพื่อจะ execute และ timeout ไปเหมือน task 2 เนื่องจากโควต้าเต็มแล้ว จะเห็นว่า Application ยัง run ได้อย่างต่อเนื่องและยังจำกันจำนวนของการ execute task ได้

สามารถศึกษาเพิ่มเติมได้ที่

Recent Posts
Archive
Search By Tags
Follow Us
  • Facebook Basic Square
  • Twitter Basic Square
  • Google+ Basic Square
bottom of page