में अनंत लूप में 100% तक बढ़ रहा है मैं एएसपी.नेट वेब अनुप्रयोग में एक वेब आधारित चैट प्लेटफॉर्म को कार्यान्वित कर रहा हूं, और मैं लंबे मतदान के समान तकनीक का उपयोग करता हूं। मेरा मतलब है कि मैं प्रत्येक वेब अनुरोध को क्लाइंट से विशिष्ट समय अवधि (टाइमआउट) या नए संदेश तक पहुंचने तक रखता हूं, और फिर ग्राहक को प्रतिक्रिया भेजी जाती है।सीपीयू उपयोग थ्रेड
मैं कनेक्ट क्लाइंट को स्मृति (शब्दकोश ऑब्जेक्ट) में रखता हूं और जब कभी क्लाइंट को नया संदेश भेजा जाता है, तो मैं यह संदेश रिसीवर क्लाइंट के संदेश सरणी में लिखता हूं। क्लाइंट को अपने संदेश प्राप्त करने का अनुरोध भेजने की आवश्यकता है, और मैं इस अनुरोध को स्मृति में सरणी में रखता हूं।
मैं श्रवण क्लाइंट अनुरोध के लिए एसिंक्रोनस http हैंडलर का उपयोग कर रहा हूं, मैं स्मृति में सरणी में वेब अनुरोध रख रहा हूं। मैं थ्रेड का उपयोग स्मृति से लगातार नए संदेशों की जांच करने के लिए करता हूं (शब्दकोश में जो प्रत्येक क्लाइंट के लिए बनाया गया है)।
मैं नए संदेशों के लिए जाँच करने के लिए थ्रेड पूल .net धागे का उपयोग करें या टाइम आउट हो गया वेब requests.I इस तरह धागे नहीं:
System.Threading.Thread t = new Thread(new ThreadStart(QueueCometWaitRequest_WaitCallback));
t.IsBackground = false;
t.Start();
प्रत्येक थ्रेड के QueueCometWaitRequest_WaitCallback विधि में मैं एक अनंत में हूँ, जबकि पाश:
while (true)
{
...
Thread.Sleep(100);
}
इस विधि में, मैं वेब अनुरोध समय बाहर या एक वेब अनुरोध जो भी स्मृति में एक सरणी में रखा जाता है के लिए नए संदेश के लिए जाँच कर रहा हूँ।
सब कुछ अच्छा काम कर रहा था जब तक कि मैंने देखा कि CPU उपयोग समय पर 100% तक पहुंच रहा है। (पहले जुड़े क्लाइंट के कुछ मिनटों में) पहले अनुरोध की शुरुआत में सबकुछ सामान्य लगता है, मेरा मतलब है कि क्लाइंट को प्रतिक्रिया लौटने पर CPU उपयोग 10% से अधिक नहीं है। लेकिन समय में भी 2 ग्राहकों के साथ सीपीयू उपयोग 100% तक बढ़ रहा है। ऐसा लगता है कि ग्राहक अनुरोध के लिए प्रतिक्रिया लिखते समय केवल CPU उपयोग 100% है। यदि कोई क्लाइंट नहीं छोड़ा जाता है तो सब कुछ एक सामान्य (सीपीयू उपयोग लगभग 0%) तक लौटाता है जब तक कि ग्राहक द्वारा नया वेब अनुरोध नहीं किया जाता है।
मुझे धागे को विस्तार से नहीं पता है, लेकिन मैं नए धागे के बारे में संदिग्ध हूं जो मैंने बनाया और असीम रूप से काम करता है। ऐसा लगता है कि ऑपरेटिंग सिस्टम उन्हें समय पर अधिक CPU उपयोग और संसाधन देता है क्योंकि वे हर समय काम कर रहे हैं, और यह थ्रेड। सो (100) काम नहीं कर रहा है।
यहाँ QueueCometWaitRequest_WaitCallback() विधि है:
void QueueCometWaitRequest_WaitCallback()
{
while (true)
{
if (processRequest.Length == 0)
{
Thread.Sleep(100);
}
else
{
for (int i = 0; i < processRequest.Length; i++)
{
Thread.Sleep(100);
// below I am checking for new message or request time out
.................
.................
// If new message or time out I write to response
}
}
}
}
मुझे आशा है कि मैं स्थिति स्पष्ट कर सकता है, और मैं भी किसी भी सुझाव के लिए खुला रहा हूँ
(एक अलग तरीके से लागू करने की तरह) आप तो इस समस्या के साथ मेरी मदद कर सकते हैं मैं कृतज्ञता से सराहना करता हूं, धन्यवाद
तो मूल रूप से आपको प्रत्येक एन-मिलीसेकंड के नए संदेशों की जांच करने की आवश्यकता है? क्या यह सब कुछ है या कुछ और async किया जाना चाहिए? यदि ऐसा है तो बस async 'System.Threading.Timer' /' System.Timers.Timer' का उपयोग करें जो प्रत्येक एन-मिलीसेकंड को ट्रिगर करता है। – sll
क्या यह लगभग आप जो हासिल करने की कोशिश कर रहे हैं? जबकि (सत्य) {थ्रेड। नींद (100); foreach (processRequest में var req) {performProcessRequest (req);} processRequest.Remove (r => r.RequestCompletedOrTimedOut);} –
@sll: मुझे क्लाइंट (नया संदेश) ASAP
पर प्रतिक्रिया वापस करने की आवश्यकता है क्योंकि यह एक चैट है आवेदन, जांच अवधि बहुत लंबी नहीं होनी चाहिए, मुझे लगता है कि अगर मैं टाइमर का उपयोग करता हूं तो इसे 1 सेकंड से छोटा होना चाहिए? – Mehmet