2011-07-01 16 views
5

प्रत्येक पाश प्रक्रिया एक कतार में आइटम ऐसी है कि इसके लिए एक समानांतर है करने के लिए क्या यह संभव है:समानांतर foreach, और कतार

  1. केवल आइटम प्रक्रिया किये जा रहे
  2. विराम को हटा जब तक नए आइटम जोड़ रहे हैं कतार में

संपादित करें: यह System.Threading.Tasks 'Parallel.ForEach कार्यक्षमता के संबंध में है

+0

इस सवाल का चेक आउट: http://stackoverflow.com/questions/6308225/tpl-architectural-question –

+0

नाह जवाब यह है कि के लिए की सवाल बहुत जटिल है। प्रतिक्रियाशील प्रोग्रामिंग समाधान है। –

उत्तर

8

प्रतिक्रियाशील एक्सटेंशन का उपयोग करके कतार की सदस्यता लें और प्रत्येक आइटम को नए कार्य में निष्पादित करें। आपको नए आइटम को अवरुद्ध या इंतजार नहीं करना पड़ेगा क्योंकि इसे आपके सब्सक्राइब लैम्ब्डा पर धकेल दिया जाएगा और आपका निष्पादन/प्रसंस्करण समानांतर होगा।

http://rxwiki.wikidot.com/101samples

+0

प्रतिक्रियाशील एक्सटेंशन धन्यवाद। –

+0

ठीक है तो यह प्रतिक्रियाशील प्रोग्रामिंग मॉडल है और आरएक्स इसका कार्यान्वयन है। धन्यवाद हसन –

0

मुझे लगता है कि यह संभव हो सकता है अगर कतार ठोस impleme ntation सिंक्रनाइज़ किया गया है, मूल रूप से यह एक उपभोक्ता उत्पादक परिदृश्य है।

+0

उह? क्षमा करें मुझे यह बिल्कुल समझ में नहीं आया :( –

+0

यदि मैं आपके प्रश्न को सही ढंग से समझ रहा हूं, तो आप प्रत्येक लूप के लिए 2 अलग-अलग कतारों को फिर से दोहराना चाहते हैं ?, इसलिए मूल रूप से आपके पास प्रत्येक लूप के लिए प्रत्येक दो धागे होंगे, इसके लिए कतार को काम करने के लिए थ्रेड के बीच सिंक्रनाइज़ेशन का समर्थन करना होगा। –

+0

ओह, माफ करना, मैं सिस्टम को रिफ्रेश कर रहा था। थ्रेडिंग। टास्क 'समानांतर। फॉरएच कार्यक्षमता। –

0

ऐसा लगता है जैसे आप क्लासिक निर्माता/उपभोक्ता स्थिति के बारे में बात कर रहे हैं। यह हमेशा मुझे आश्चर्यचकित करता है कि इस मॉडल के लिए .NET में निर्मित अधिक प्रत्यक्ष समर्थन नहीं है। मैं निकटतम में आया हूं। नेट एक समय में समेकन और समन्वय रनटाइम के अंदर छिपा हुआ था, जो माइक्रोसॉफ्ट रोबोटिक्स सूट का हिस्सा था। शुभकामनाएं अब इसे ढूंढ रही हैं।

लेकिन एक बार जब आप जानते हैं कि क्या खोजना है, तो एक त्वरित Google चेक कुछ अन्य संभावित विकल्प प्रदान करता है।

1

इस तरह का प्रयोग करें BlockingCollection कुछ: बहुत

var bc = new BlockingCollection<int>(); 
Task.Factory.StartNew(() => 
    { 
     ParallelOptions options = new ParallelOptions 
      { 
       MaxDegreeOfParallelism = 30 
      }; 
     Parallel.ForEach(bc.GetConsumingEnumerable(), options, i => { }); 
    }); 
+1

इसलिए कार्य तब तक इंतजार करेगा जब तक कि सही जारी रखने से पहले नए आइटम संग्रह में नहीं रखा जाता? –

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