2010-12-07 10 views
5

मेरे पास एक फ़ंक्शन है, जो 6100 सूची आइटमों की एक सूची को संसाधित करता है। कोड काम करने के लिए प्रयुक्त होता था जब सूची केवल 300 आइटम थी। लेकिन तुरंत 6100 के साथ दुर्घटनाग्रस्त हो जाता है। क्या कोई तरीका है कि मैं इन 6100 वस्तुओं के माध्यम से एक बार में 30 कह सकता हूं और प्रति आइटम एक नया धागा निष्पादित कर सकता हूं?सी # .net के लिए() चरण?

for (var i = 0; i < ListProxies.Items.Count; i++) 
    { 
     var s = ListProxies.Items[i] as string; 
     var thread = new ParameterizedThreadStart(ProxyTest.IsAlive); 
     var doIt = new Thread(thread) { Name = "CheckProxy# " + i }; 
     doIt.Start(s); 
    } 

किसी भी मदद की सराहना की जाएगी।

+3

रिकॉर्ड के लिए, स्पॉटिंग और नामकरण वास्तव में क्रैश (लाइन) और क्रैश संदेश समाधान खोजने में बहुत मदद करता है – Eric

उत्तर

10

क्या आप वास्तव में प्रत्येक कार्य आइटम के लिए एक नया धागा तैयार करने की आवश्यकता है? जब तक इसकी वास्तविक आवश्यकता न हो (यदि ऐसा है, तो कृपया हमें बताएं क्यों), मैं दृढ़ता से अनुशंसा करता हूं कि आप Managed Thread Pool का उपयोग करें। यह आपको आवश्यक समेकन लाभ प्रदान करेगा, लेकिन हजारों धागे चलाने के संसाधन संसाधनों के साथ-साथ सृजन, विनाश और भारी संदर्भ-स्विचिंग लागत) के बिना। यदि आप .NET 4.0 पर हैं, तो आप Task Parallel Library का उपयोग करने पर भी विचार करना चाहेंगे।

उदाहरण के लिए:

for (var i = 0; i < ListProxies.Items.Count; i++) 
{ 
    var s = ListProxies.Items[i] as string; 
    ThreadPool.QueueUserWorkItem(ProxyTest.IsAlive, s);  
} 

एक और नोट पर, मैं गंभीरता से नाम बदलने पर विचार करेंगे IsAlive विधि (जो एक बूलियन संपत्ति या विधि की तरह दिखता है) के बाद से:

  1. यह स्पष्ट रूप से एक void IsAlive(object) हस्ताक्षर हैं ।
  2. इसमें अवलोकन दुष्प्रभाव हैं (आपकी टिप्पणी से यह "प्रगति पट्टी बढ़ाता है और एक नई सूची में 'काम करने' प्रॉक्सी जोड़ता है")।
+1

थ्रेडपूल बिल्कुल यहां जाने का तरीका होगा। धागे महंगी हैं। – lesscode

+0

सहमत हुए। जब तक ये लंबे समय से चलने वाले धागे नहीं होते हैं, यह थ्रेड-पूल के लिए एक जगह होगी। मुझे लगता है कि आप कोर को लोड फैलाने के लिए समानांतर लाइब्रेरी और समांतर उपयोग भी कर सकते हैं। – Zippit

+0

@Wayne Threads वास्तव में महंगे नहीं हैं ... 6000 धागे केवल पूरी तरह से अत्यधिक हैं :-) (आप संख्या का प्रबंधन करने के लिए कुछ उपयोग करने के बारे में सही हैं।) –

3

धागे की संख्या पर एक सीमा है जो आप पैदा कर सकते हैं। 6100 धागे काफी हद तक प्रतीत होता है।

मैं एनी जीतने के लिए सहमत हूं, आपको जो भी पूरा करने की कोशिश कर रहे हैं उसके आधार पर आपको थ्रेडपूल या यहां तक ​​कि निर्माता/उपभोक्ता प्रक्रिया में देखना चाहिए।

बहु थ्रेडेड अनुप्रयोगों को संभालने के लिए बहुत सी प्रक्रियाएं हैं लेकिन शुरुआत में आप क्या कर रहे हैं यह जानने के बिना वास्तव में थ्रेडपूल या निर्माता/उपभोक्ता प्रक्रिया (सिंक एवेन्ट्स के साथ पंक्तियां) के अलावा किसी अन्य दृष्टिकोण की सिफारिश करने का कोई तरीका नहीं है।

किसी भी दर पर आपको वास्तव में धागे की संख्या को न्यूनतम रखने की कोशिश करनी चाहिए अन्यथा आप धागे के ताले, स्पिन ताले, ताले की प्रतीक्षा, मृत ताले, दौड़ की स्थिति, जो जानता है, आदि का जोखिम चलाते हैं ...

यदि आप सी # के साथ थ्रेडिंग पर अच्छी जानकारी चाहते हैं तो Concurrent Programming on Windows By Joe Duffy पुस्तक को चेक करें, यह वास्तव में सहायक है।

संबंधित मुद्दे