इसने वास्तव में मुझे दो बार काट दिया है। यदि आप इस तरह के सरल कोड करते हैं:नेट थ्रेड में हैंडल रिसाव
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 1000000; i++)
{
Thread CE = new Thread(SendCEcho);
CE.Priority = ThreadPriority.Normal;
CE.IsBackground = true;
CE.Start();
Thread.Sleep(500);
GC.Collect();
}
}
private void SendCEcho()
{
int Counter = 0;
for (int i = 0; i < 5; i++)
{
Counter++;
Thread.Sleep(25);
}
}
इस कोड को चलाएं और हैंडल उड़ें! थ्रेड। सो जाओ इसलिए आप इसे बंद कर सकते हैं और यह आपको कंप्यूटर पर नहीं ले जाता है। यह गारंटी देनी चाहिए कि अगली धागा लॉन्च होने से पहले थ्रेड लॉन्च हो जाता है। कॉलिंग जीसी। कोलेक्ट(); कुछ नहीं करता। मेरे अवलोकन से यह कोड सामान्य रीफ्रेश पर कार्य प्रबंधक को हर रीफ्रेश 10 हैंडल खो देता है।
इससे कोई फर्क नहीं पड़ता कि Send Sendcho() फ़ंक्शन में क्या है, यदि आप चाहें तो पांच की गणना करें। जब धागा मर जाता है तो वहां एक संभाल होता है जिसे साफ़ नहीं किया जाता है।
अधिकांश कार्यक्रमों के साथ यह वास्तव में कोई फर्क नहीं पड़ता क्योंकि वे विस्तारित अवधि के लिए नहीं चलते हैं। मैंने बनाए गए कुछ कार्यक्रमों पर उन्हें अंत में महीनों और महीनों तक चलने की जरूरत है।
यदि आप इस कोड को अधिक से अधिक व्यायाम करते हैं, तो अंततः आप उस बिंदु पर हैंडल कर सकते हैं जहां विंडोज ओएस अस्थिर हो जाता है और यह काम नहीं करेगा। रिबूट करने की आवश्यकता है।
मैं एक धागा पूल और इस तरह कोड का उपयोग करके समस्या का समाधान किया:
ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadJobMoveStudy));
मेरा प्रश्न हालांकि क्यों नेट में इस तरह के एक रिसाव है, और क्यों यह इतने लंबे समय के लिए ही अस्तित्व में है? 1.0 की तरह से? मुझे यहां जवाब नहीं मिला।
आप हैंडल कैसे देख रहे हैं? –
@Yacoub विंडोज़ टास्क मैनेजर में। यह गंभीरता से सभी उपलब्ध हैंडल को रिसाव करेगा और ओएस को अस्थिर बना देगा। – Jake
@ pm100 .net मुझे ऐसा करने की अनुमति देता है। इस तरह थ्रेडिंग करने के लिए बहुत सारे ट्यूटोरियल दिखाए जा रहे हैं। मैं वादा करता हूं कि यदि आप इस कोड को ओवर-ओवर चलाते हैं, शून्य कार्य में कुछ भी नहीं डालते हैं, तो आप ओएस को अस्थिर बना देंगे। – Jake