PLINQ

2010-02-18 9 views
7

के साथ शून्य लौट रहा है मेरे पास आईनेमरेबल के लिए एक विस्तार विधि है जो तब संग्रह के माध्यम से पुन: सक्रिय होती है, अपना व्यवसाय कर रही है, और फिर एक नया आईनेमरेबल लौटाती है।PLINQ

मैंने PLINQ का उपयोग करके PLINQ का उपयोग करने का प्रयास किया है। AsParallel()। ForAll() जो पुनरावृत्तियों को महत्वपूर्ण रूप से गति देता है (जो निश्चित रूप से करना चाहिए) हालांकि जब संग्रह वापस किया जाता है, तो उस संग्रह में अक्सर कुछ वस्तुएं होती हैं शून्य हैं

मुझे लगता है कि ऐसा हो सकता है क्योंकि यह सभी 'व्यवसाय' को पूरा करने का मौका मिलने से पहले संग्रह वापस कर रहा है? अगर मैं डीबग करता हूं और ब्रेकपॉइंट में डालता हूं, तो कोई शून्य नहीं होती है।

क्या इस तरह के 'ऑपरेशन को पूरा करने के लिए प्रतीक्षा करें' विधि है जिसका उपयोग मुझे करना चाहिए?

संपादित करें: थोड़ा स्पष्ट होने के लिए, फ़ोरल में व्यवसाय तर्क है, गुणों को संशोधित करना आदि। कुछ चुनने के बजाय, एक क्रिया को लूप करना आवश्यक है।

+0

आप हमें एक कोड नमूना दिखा सकते हैं? –

+0

समांतर अक्षय FORAll() कुछ भी वापस नहीं करता है (शून्य के लिए शून्य (...)), एक आईनेमरेबल नहीं - यदि आप ForAll का उपयोग कर रहे हैं, तो आप एक गणना नहीं कर रहे हैं ... आपको दिखाना होगा कोड। –

+0

अस्पष्टता के लिए खेद है। विधि संग्रह वापस आती है, न कि कुल मिलाकर। आगे की जांच के बाद – benpage

उत्तर

1

उत्तर पर लौटने का मतलब है, क्योंकि ForAll विधि कुछ भी वापस नहीं करता है। यह उस प्रतिनिधि को आमंत्रित करता है जिसे आप संग्रह के सभी तत्वों के लिए समानांतर में निर्दिष्ट करते हैं। मुझे लगता है कि होता है कि अपने कोड इस तरह दिखता है:

data.AsParallel().ForAll(() => /* calculate and store result somewhere */); 
// more code 

सभी प्रतिनिधियों को पूरा करने के लिए के लिए ForAll विधि इंतजार नहीं करता, इसलिए more code सभी प्रतिनिधियों को पूरा करने से पहले निष्पादित कर सकते हैं (और आप भी store result somewhere में सावधान रहने की जरूरत है ! बिट है, क्योंकि यह कई प्रतिनिधियों के लिए एक समय पर हो सकता है)

मुझे लगता है कि कोड Select पद्धति का उपयोग करके अधिक सुंदर ढंग से फिर से लिखा जा सकता है:

var res = data.AsParallel().Select(() => /* calculate the result */); 

इस cas में ई, प्रतिनिधि बस परिणाम देता है। Where विधि सभी परिणामों को एकत्रित करती है और जब आप IEnumerable पर वापस आते हैं, तो यह गारंटी देता है कि सभी प्रतिनिधियों ने गणना की है।

+0

धन्यवाद टॉम - अस्पष्टता के लिए खेद है, विधि संग्रह लौटाती है, इसे फ़ॉरल से वापस नहीं किया जा सकता है - वहां बहुत अधिक व्यवसाय तर्क है। – benpage

+0

उस स्थिति में, आपको वास्तव में सावधान रहना होगा, क्योंकि कार्य एक साथ निष्पादित कर रहे हैं - आपको लगभग निश्चित रूप से कुछ ताले की आवश्यकता होती है। जब आपके पास "राज्य को संशोधित करता है" (उर्फ अनिवार्य है) के बजाय कोड "परिणाम देता है" (उर्फ कार्यात्मक) है तो PLINQ का सबसे अच्छा उपयोग किया जाता है। –

0

ForAll() विलय नहीं करता है, और तुरंत लौटाता है। Parallel.ForEach() शायद वह कार्यक्षमता है जिसे आप ढूंढ रहे हैं।

यानी बजाय:

collection.AsParallel().ForAll(t=>t.doWork());

कुछ

तरह

Parallel.ForEach(collection.AsParallel(), t=>t.doWork());

+0

हम्म .. कोई अच्छा नहीं - समांतर। फॉरएच (संग्रह, टी => t.doWOrk()); एक ही समस्या का कारण बनता है, और समानांतर। फॉरएच (संग्रह। एस्परेल(), टी => t.doWork()); एक समग्र अपवाद – benpage

+0

अजीब फेंकता है ... 'समानांतर। फॉरएच()' एक 'समानांतर लूपअप' देता है जिसमें 'IsCompleted' संपत्ति है जिसे आप चेक कर सकते हैं। मैं 'AggregateException' की सामग्री को देखता हूं, हालांकि, शायद आपके 'doWork()' फ़ंक्शन में कुछ ठीक से नहीं हो रहा है। – Tanzelax

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