เมื่อไหร่ที่ฉัน ไม่
ควรใช้ ThreadPool ใน .Net?
ThreadPool
ใน .Net มักถูกมองว่าเป็นทางเลือกที่ดีในการจัดการการทำงานหลายเธรดอย่างมีประสิทธิภาพ ความสามารถในการจัดการกลุ่มเธรดทำงานช่วยให้สามารถดำเนินการภารกิจในลักษณะพร้อมกันโดยไม่ต้องมีภาระในการสร้างและทำลายเธรดตามต้องการ อย่างไรก็ตาม มีสถานการณ์เฉพาะที่การใช้ ThreadPool
อาจไม่ใช่วิธีที่ดีที่สุด ในโพสต์นี้ เราจะสำรวจว่าเมื่อใดควรหลีกเลี่ยง ThreadPool
และมีทางเลือกใดบ้าง
เหตุผลที่ควรหลีกเลี่ยง ThreadPool
-
ต้องการปฏิสัมพันธ์กับวิธีการที่กำลังทำงานอยู่
- หากแอปพลิเคชันของคุณต้องการให้คุณทำงานร่วมกับหรือจัดการการทำงานของเธรด เช่น การยุติการทำงาน คุณควรหลีกเลี่ยงการใช้
ThreadPool
เธรดในThreadPool
ถูกจัดการโดยระบบและอาจไม่อนุญาตให้ทำการยุติได้อย่างเหมาะสม
- หากแอปพลิเคชันของคุณต้องการให้คุณทำงานร่วมกับหรือจัดการการทำงานของเธรด เช่น การยุติการทำงาน คุณควรหลีกเลี่ยงการใช้
-
ความต้องการสำหรับเธรดที่เป็น Single-Threaded Apartment (STA)
- มีกรณีหลายอย่าง โดยเฉพาะเมื่อทำงานกับเฟรมเวิร์ก UI บางประเภทหรือ COM interop ที่คุณต้องการให้โค้ดทำงานในเธรดที่เป็น Single-Threaded Apartment (STA) เนื่องจากเธรดใน
ThreadPool
เป็นหลายเธรด จึงไม่สนับสนุนความต้องการนี้ ซึ่งอาจทำให้เกิดข้อผิดพลาดในระหว่างการทำงาน
- มีกรณีหลายอย่าง โดยเฉพาะเมื่อทำงานกับเฟรมเวิร์ก UI บางประเภทหรือ COM interop ที่คุณต้องการให้โค้ดทำงานในเธรดที่เป็น Single-Threaded Apartment (STA) เนื่องจากเธรดใน
-
ต้องการให้เธรดทำงานหลังจากปิดแอปพลิเคชัน
- เธรดจาก
ThreadPool
เป็นเธรดพื้นหลังตามค่าเริ่มต้น นั่นหมายความว่าพวกเขาจะสิ้นสุดการทำงานโดยอัตโนมัติเมื่อแอปพลิเคชันสิ้นสุด ไม่ว่าจะกำลังทำงานอยู่หรือไม่ หากคุณต้องการให้เธรดสามารถรักษาสถานะไว้ได้แม้หลังจากที่แอปพลิเคชันหลักเสร็จสิ้นThreadPool
ก็ไม่ใช่ตัวเลือกที่เหมาะสม
- เธรดจาก
-
การเปลี่ยนลำดับความสำคัญของเธรด
ThreadPool
ไม่อนุญาตให้มีการเปลี่ยนแปลงลำดับความสำคัญของเธรด ค่าเริ่มต้นของลำดับความสำคัญของเธรดจะตั้งไว้ที่ Normal และหากแอปพลิเคชันของคุณต้องการให้เธรดทำงานด้วยลำดับความสำคัญที่แตกต่างออกไป คุณต้องมองหาตัวเลือกการทำงานหลายเธรดอื่น ๆ
ตัวเลือกทางเลือก
ในขณะที่ ThreadPool
มีประสิทธิภาพสำหรับหลายสถานการณ์ แต่เป็นสิ่งสำคัญที่ต้องรู้ว่าเมื่อใดควรพิจารณาทางเลือกอื่น นี่คือตัวเลือกที่น่าสนใจสองประการ:
-
เธรดที่ชัดเจน
- การสร้างเธรดที่ชัดเจนโดยใช้คลาส
Thread
ช่วยให้คุณควบคุมการจัดการเธรด การยุติการทำงาน ลำดับความสำคัญ และความสามารถในการทำงานบนประเภทอพาร์ตเมนต์เฉพาะได้อย่างเต็มที่
- การสร้างเธรดที่ชัดเจนโดยใช้คลาส
-
Parallel Extensions Framework
- Parallel Extensions Framework ให้วิธีการที่ซับซ้อนมากขึ้นในการจัดการความขนานในแอปพลิเคชันของคุณ ช่วยทำให้การดำเนินการต่าง ๆ ง่ายขึ้นและให้โครงสร้างที่สามารถตัดความจำเป็นในการจัดการเธรดด้วยตนเองได้
สรุป
โดยสรุป แม้ว่า ThreadPool
จะเป็นฟีเจอร์ที่มีพลังใน .Net สำหรับการจัดการภารกิจหลายเธรด แต่การรับรู้เมื่อใดที่อาจไม่เติมเต็มความต้องการของคุณอย่างเหมาะสมเป็นสิ่งสำคัญ หากคุณพบว่าตนเองอยู่ในสถานการณ์ที่ต้องการการควบคุมโดยตรงในด้านการดำเนินการของเธรด ความเข้ากันได้ของ STA เธรดยาวนาน หรือการตั้งค่าสำหรับลำดับความสำคัญที่พิเศษ ให้พิจารณาการใช้เธรดที่ชัดเจนหรือสำรวจ Parallel Extensions Framework เป็นตัวเลือกที่เหมาะสม
สำหรับการอ่านเพิ่มเติม บทความใน MSDN “The Managed Thread Pool” มีรายการรายละเอียดเกี่ยวกับสถานการณ์ที่ไม่ควรใช้ ThreadPool
—ซึ่งคุ้มค่าที่จะตรวจสอบสำหรับทุกคนที่ต้องการทำความเข้าใจเธรดใน .Net ให้ดีขึ้น