यहाँ अन्य उत्तर सबसे महत्वपूर्ण बिंदु को छोड़ते हुए प्रतीत होते हैं:
जब तक आप कम-लोड साइट पर तेजी से काम करने के लिए सीपीयू-गहन ऑपरेशन को समानांतर करने की कोशिश कर रहे हैं, तब तक श्रमिक थ्रेड का उपयोग करने का कोई मतलब नहीं है।
अनुरोधों के जवाब new Thread(...)
में दोनों मुक्त धागे, द्वारा बनाए गए , और कार्यकर्ता धागे के ThreadPool
लिए जाते QueueUserWorkItem
हैं।
हां, यह सच है, आप ASP.NET प्रक्रिया में बहुत अधिक काम की वस्तुओं की कतार लगाकर भूखे रह सकते हैंThreadPool
। यह ASP.NET को आगे के अनुरोधों को संसाधित करने से रोकेगा। लेख की जानकारी उस संबंध में सटीक है; QueueUserWorkItem
अनुरोधों की सेवा के लिए उपयोग किए जाने वाले समान थ्रेड पूल का भी उपयोग किया जाता है।
लेकिन अगर आप वास्तव में इस भुखमरी का कारण बनने के लिए पर्याप्त कार्य वस्तुओं की कतार लगा रहे हैं, तो आपको थ्रेड पूल को भूखा रखना चाहिए! यदि आप एक ही समय में सैकड़ों सीपीयू-सघन संचालन कर रहे हैं, तो ASP.NET अनुरोध पर काम करने के लिए एक और श्रमिक धागा रखने से क्या अच्छा होगा, जब मशीन पहले से ही ओवरलोड हो? यदि आप इस स्थिति में चल रहे हैं, तो आपको पूरी तरह से नया स्वरूप देने की आवश्यकता है!
अधिकांश समय मैं बहु-थ्रेडेड कोड के बारे में ASP.NET में अनुचित रूप से उपयोग किए जाने के बारे में देखता या सुनता हूं, यह सीपीयू-गहन कार्य को कतारबद्ध करने के लिए नहीं है। यह कतारबद्ध I / O- बाउंड कार्य के लिए है। और यदि आप I / O कार्य करना चाहते हैं, तो आपको I / O थ्रेड (I / O पूर्णता पोर्ट) का उपयोग करना चाहिए।
विशेष रूप से, आप जो भी पुस्तकालय वर्ग का उपयोग कर रहे हैं, उसके द्वारा समर्थित 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
। यह केवल .NET फ्रेमवर्क लाइब्रेरी क्लासेज का बिल्ट-इन एसिंक्स मेथड है जो ऐसा करने में सक्षम हैं। आप इसे स्वयं कर सकते हैं, लेकिन यह जटिल और थोड़ा खतरनाक है और शायद इस चर्चा के दायरे से परे है।
इस सवाल का सर्वश्रेष्ठ उत्तर, मेरी राय में, है का उपयोग नहीं करते ThreadPool
या एक पृष्ठभूमि Thread
उदाहरण ASP.NET में । यह विंडोज फॉर्म एप्लीकेशन में एक धागे को पिरोने जैसा बिल्कुल भी नहीं है, जहां आप यूआई को रिस्पांसिबल रखने के लिए ऐसा करते हैं और इस बात की परवाह नहीं करते कि यह कितना कारगर है। ASP.NET में, आपकी चिंता थ्रूपुट है , और उन सभी वर्कर थ्रेड्स पर स्विच करने वाले सभी संदर्भ आपके थ्रूपुट को मारने जा रहे हैं, चाहे आप इसका उपयोग करें ThreadPool
या नहीं।
कृपया, यदि आप खुद को ASP.NET में थ्रेडिंग कोड लिखते हुए पाते हैं - विचार करें कि क्या यह पहले से मौजूद अतुल्यकालिक विधियों का उपयोग करने के लिए फिर से लिखा जा सकता है या नहीं, और यदि यह नहीं हो सकता है, तो कृपया विचार करें कि क्या आपको वास्तव में कोड की आवश्यकता है या नहीं एक पृष्ठभूमि थ्रेड में चलाने के लिए। अधिकांश मामलों में, आप शायद शुद्ध लाभ के लिए जटिलता जोड़ रहे हैं।