c# - How to run LINQ 'let' statements in parallel? -


मेरे पास ऐसा कोड है:

  var list = new list & lt; int & gt; {1, 2, 3, 4, 5}; Var परिणाम = एक्स में सूची में। एस्पेरेलल () एक = लंगरिंगकैल्को 1 (एक्स) दें बी = लंगरिंगकैल्को 2 (एक्स) नया {a, b} चुनें;  

हम कहते हैं कि लोंगरलिंगकैकल तरीके प्रत्येक को 1 सेकंड लेते हैं। ऊपर दिए गए कोड को चलाने के लिए लगभग 2 सेकंड लगते हैं, क्योंकि 5 तत्वों की सूची समानांतर पर संचालित होती है, क्योंकि चलो स्टेटमेंट से बुलाए गए दो तरीकों को क्रमिक रूप से कहा जाता है।

हालांकि , इन विधियों को सुरक्षित रूप से समानांतर में भी बुलाया जा सकता है। उन्हें स्पष्ट रूप से चुनें के लिए मर्ज करने की आवश्यकता है, लेकिन तब तक समानांतर में चलना चाहिए - चुनें उनके लिए इंतजार करना चाहिए।

क्या कोई तरीका है

आप क्वेरी सिंटैक्स या का उपयोग करने में सक्षम नहीं होंगे ऑपरेशन, लेकिन आप समानांतर में प्रत्येक आइटम के लिए कई कार्रवाइयां करने के लिए एक विधि लिख सकते हैं:

  सार्वजनिक स्थिर समानांतरता & lt; TFinal & gt; चयन करेंसभी & lt; टी, TResult1, TResult2, TFinal & gt; (यह ParallelQuery & lt; T & gt; क्वेरी, फ़ंक्शन & lt; T, TResult1 & gt; चयनकर्ता 1, फ़नक & lt; T, TRsult2 & gt; चयनकर्ता 2, फ़ंक्स & lt; TResult1, TResult2, TFinal & gt; परिणामअगेटर) {वापसी क्वेरी। आइटम = & gt; {var result1 = कार्य.रुण (() = & gt; चयनकर्ता 1 (वस्तु)); var परिणाम 2 = कार्य.रुण (() = & gt; चयनकर्ता 2 (आइटम)); परिणामस्वरूप परिणामस्वरूपअगेटर (परिणाम 1। परिणाम, परिणाम 2 परिणाम);     }); }  

यह आपको लिखने की अनुमति देगा:

  var query = list.AsParallel ()। चयन करेंल (LongRunningCalc1, LongRunningCalc2, (a, b) = & Gt; नया {a, b})  

आप अतिरिक्त समांतर संचालन के लिए ओवरलोड भी जोड़ सकते हैं:

  सार्वजनिक स्थिर समानांतरता & lt; टीफ़नल & gt; चुनें सभी & lt; टी, TResult1, TResult2, TResult3, TFinal & gt; (यह पैरालेलक्वेरी & lt; T & gt; क्वेरी, फ़ंक्शन & lt; T, TResult1 & gt; चयनकर्ता 1, फ़ंक्स & lt; टी, ट्रसल्ट 2 & gt; चयनकर्ता 2, फ़ंक् & टीटी; टी, ट्रस्ट 3 & gt; चयनकर्ता 3, फ़ंक्स & lt; ट्रस्ट 1, ट्रसल्ट 2, ट्रेशल 3, टीएफनल & gt; परिणाम एगेजेटर) {वापसी क्वेरी। आइटम = & gt; {var परिणाम 1 = कार्य.रुण (() = & gt; चयनकर्ता 1 (वस्तु)); var परिणाम 2 = कार्य.रुण (() = & gt; चयनकर्ता 2 (वस्तु)); var परिणाम 3 = कार्य.रुन (() = & Gt; चयनकर्ता 3 (आइटम)); वापसी परिणामअग्रेगेटर (परिणाम 1। परिणाम, परिणाम 2। परिणाम, परिणाम 3। परिणाम);}); }  

संकलित समय में कई चयनकर्ताओं को संभाल करने के लिए एक संस्करण लिखना संभव है, लेकिन ऐसा करने के लिए उन सभी को एक ही प्रकार के मान की गणना करने की आवश्यकता है:

<प्री> सार्वजनिक स्थिर पैरालेलक्वेरी & lt; IEnumerable & lt; TRTTULT & gt; & gt; चयन करेंसभी & lt; T, TResult & gt; (यह ParallelQuery & lt; T & gt; क्वेरी, IEnumerable & lt; Func & lt; T, TResult & gt; & gt; चयनकर्ता) {वापसी क्वेरी। चयन करें (आइटम = & gt; चयनकर्ता। एस्पेरेल ()। चयन करें (चयनकर्ता = & gt; चयनकर्ता आइटम))। एएनएनमेरेबल ()); } पब्लिक स्टेटिक पैरालेलक्वेरी & lt; IEnumerable & lt; TRTTULT & gt; & gt; चुनें सभी & lt; T, TResult & gt; (यह ParallelQuery & lt; T & gt; क्वेरी, पैरामीटर फ़ंक्शन & lt; T, TResult & gt; [] चयनकर्ता) {Select Select All (क्वेरी, चयनकर्ता); }

Comments

Popular posts from this blog

java - Can't add JTree to JPanel of a JInternalFrame -

javascript - data.match(var) not working it seems -

javascript - How can I pause a jQuery .each() loop, while waiting for user input? -