คำตอบอื่น ๆ ที่นี่ดูเหมือนจะไม่ตรงประเด็นที่สำคัญที่สุด:
เว้นแต่คุณจะพยายามขนานการดำเนินการที่ต้องใช้ CPU มากเพื่อให้ทำงานได้เร็วขึ้นในไซต์ที่มีโหลดต่ำคุณจะใช้เธรดของผู้ปฏิบัติงานไม่ได้เลย
ซึ่งใช้ได้กับทั้งเธรดฟรีที่สร้างโดยnew Thread(...)
และเธรดผู้ปฏิบัติงานในเธรดThreadPool
ที่ตอบสนองต่อQueueUserWorkItem
คำร้องขอ
ใช่เป็นเรื่องจริงคุณสามารถอดอาหารThreadPool
ในกระบวนการ ASP.NET ได้โดยการจัดคิวรายการงานมากเกินไป จะป้องกันไม่ให้ ASP.NET ประมวลผลคำขอเพิ่มเติม ข้อมูลในบทความมีความถูกต้องตามนั้น เธรดพูลเดียวกันที่ใช้QueueUserWorkItem
ยังใช้เพื่อตอบสนองการร้องขอ
แต่ถ้าคุณเข้าคิวรายการงานมากพอที่จะทำให้เกิดความอดอยากนี้คุณก็ควรจะอดด้าย! หากคุณใช้งานการดำเนินการที่ต้องใช้ CPU เป็นจำนวนมากในเวลาเดียวกันการมีเธรดของผู้ปฏิบัติงานอื่นเพื่อตอบสนองคำขอ ASP.NET เมื่อเครื่องทำงานหนักเกินไปแล้ว หากคุณกำลังเผชิญกับสถานการณ์นี้คุณต้องออกแบบใหม่ทั้งหมด!
เวลาส่วนใหญ่ที่ฉันเห็นหรือได้ยินเกี่ยวกับโค้ดมัลติเธรดที่ถูกใช้อย่างไม่เหมาะสมใน ASP.NET ไม่ใช่สำหรับการจัดคิวงานที่ต้องใช้ CPU มาก สำหรับการจัดคิวงานที่ผูกกับ I / O และถ้าคุณต้องการทำงาน I / O คุณควรใช้เธรด I / O (I / O Completion Port)
โดยเฉพาะอย่างยิ่งคุณควรใช้การเรียกกลับแบบ async ที่รองรับโดยคลาสไลบรารีที่คุณใช้อยู่ วิธีการเหล่านี้จะมีป้ายกำกับชัดเจนเสมอ พวกเขาเริ่มต้นด้วยคำพูดและBegin
End
ในขณะที่Stream.BeginRead
, Socket.BeginConnect
, WebRequest.BeginGetResponse
และอื่น ๆ
วิธีการเหล่านี้ทำใช้ThreadPool
แต่พวกเขาใช้ IOCPs ซึ่งจะไม่ยุ่งเกี่ยวกับการร้องขอ ASP.NET เป็นด้ายน้ำหนักเบาชนิดพิเศษที่สามารถ "ตื่น" ได้ด้วยสัญญาณขัดจังหวะจากระบบ I / O และในแอปพลิเคชัน ASP.NET โดยปกติคุณจะมีเธรด I / O หนึ่งเธรดสำหรับเธรดของผู้ปฏิบัติงานแต่ละรายการดังนั้นทุกคำขอเดียวจึงสามารถจัดคิวการดำเนินการ async ได้หนึ่งรายการ นั่นคือการดำเนินการ async หลายร้อยครั้งโดยไม่มีการลดประสิทธิภาพลงอย่างมีนัยสำคัญ (สมมติว่าระบบย่อย I / O สามารถรักษาได้) เป็นมากกว่าที่คุณต้องการ
เพียงแค่เก็บไว้ในใจว่า async ผู้ได้รับมอบหมายไม่ได้ทำงานด้วยวิธีนี้ - ThreadPool.QueueUserWorkItem
พวกเขาจะสิ้นสุดการใช้ด้ายคนเช่นเดียวกับ เป็นเพียงวิธีการ async ในตัวของคลาสไลบรารี. NET Framework ที่สามารถทำสิ่งนี้ได้ คุณสามารถทำได้ด้วยตัวเอง แต่มันซับซ้อนและค่อนข้างอันตรายและอาจเกินขอบเขตของการสนทนานี้
คำตอบที่ดีที่สุดสำหรับคำถามนี้ในความคิดของฉันคืออย่าใช้อินสแตนซ์ThreadPool
หรือพื้นหลังThread
ใน ASP.NETASP.NET ไม่เหมือนกับการหมุนเธรดในแอปพลิเคชัน Windows Forms ที่คุณทำเพื่อให้ UI ตอบสนองและไม่สนใจว่าจะมีประสิทธิภาพเพียงใด ใน ASP.NET ความกังวลของคุณคือปริมาณงานและบริบททั้งหมดที่เปิดใช้งานเธรดของผู้ปฏิบัติงานทั้งหมดจะฆ่าปริมาณงานของคุณอย่างแน่นอนไม่ว่าคุณจะใช้ThreadPool
หรือไม่ก็ตาม
โปรดหากคุณพบว่าตัวเองกำลังเขียนโค้ดเธรดใน ASP.NET - พิจารณาว่าสามารถเขียนใหม่เพื่อใช้วิธีอะซิงโครนัสที่มีอยู่แล้วหรือไม่และหากไม่สามารถทำได้โปรดพิจารณาว่าคุณต้องการรหัสจริงหรือไม่ เพื่อรันในเธรดพื้นหลังเลย ในกรณีส่วนใหญ่คุณอาจจะเพิ่มความซับซ้อนโดยไม่ได้รับประโยชน์สุทธิ