में समांतर विशेषताएं। मैं नेट 4.0 में कुछ नई समांतर सुविधाओं की व्यावहारिकता पर जा रहा हूं।.NET 4.0
मैं बहुत की तरह कोड है कहते हैं:
foreach (var item in myEnumerable)
myDatabase.Insert(item.ConvertToDatabase());
कल्पना कीजिए myDatabase.Insert एक SQL डेटाबेस को सम्मिलित करने के लिए कुछ काम कर रहा है।
सैद्धांतिक रूप से आप लिख सकते हैं:
Parallel.ForEach(myEnumerable, item => myDatabase.Insert(item.ConvertToDatabase()));
और स्वचालित रूप से आप कोड है कि कई कोर का लाभ लेता है मिलता है।
लेकिन क्या होगा यदि मेरा अनन्य केवल एक धागे से ही बातचीत की जा सके? समांतर वर्ग एक धागे द्वारा गणना करेगा और केवल लूप में कार्यकर्ता धागे के परिणाम को प्रेषित करेगा?
क्या होगा यदि मेराडेटाबेस केवल एक थ्रेड द्वारा ही बातचीत की जा सके? लूप के प्रति पुनरावृत्ति के लिए डेटाबेस कनेक्शन बनाना निश्चित रूप से बेहतर नहीं होगा।
अंत में, यदि मेरा "var item" उपयोगकर्ता नियंत्रण या ऐसा कुछ होता है जिसे यूआई थ्रेड पर इंटरैक्ट किया जाना चाहिए?
इन समस्याओं को हल करने के लिए मुझे किस डिजाइन पैटर्न का पालन करना चाहिए?
यह मुझे देख रहा है कि समानांतर/PLinq/आदि पर स्विच करना बिल्कुल वास्तविक नहीं है जब आप असली दुनिया के अनुप्रयोगों से निपट रहे हैं।
अब तक का सबसे अच्छा जवाब, साइड सवाल हालांकि: मेरा लूप-बॉडी एक लंबे समय तक चलने वाले आईओ ऑपरेशन (नेटवर्क अनुरोध, डेटाबेस इत्यादि) करता है, क्या समांतर वर्ग नींद/निलंबित धागे का पता लगाएगा और स्वचालित रूप से एक नया शुरू करेगा? या यह मशीन पर कोर की संख्या तक सीमित रहेगा? – jonathanpeppers
@ जोनाथन। पेपर: डिफ़ॉल्ट कार्य शेड्यूलर यह बहुत अच्छी तरह से संभालता है। यह स्थिति में अतिरिक्त काम इंजेक्षन करेगा। (डिफ़ॉल्ट रूप से, थ्रेडपूल धागे की तुलना में कई और तत्वों का उपयोग करता है, और गतिशील रूप से वर्कलोड के आधार पर वापस स्केल करता है) –