2010-04-30 14 views
10

क्या बीच का अंतर है बनाने के लिए:मतभेद समवर्ती कार्यक्रमों

  1. एक नया धागा
  2. TPL
  3. का उपयोग करते हुए इन सभी के संगामिति बनाने BackgroundWorker

का उपयोग करना शुरू लेकिन इनके बीच निम्न स्तर के अंतर क्या हैं? क्या सभी 3 थ्रेड बनाते हैं?

धन्यवाद

उत्तर

19

वे सभी आंतरिक धागे का उपयोग करें, मतभेद प्रत्येक एपीआई के अमूर्त स्तर और कैसे धागे उपयोग किया जाता है के साथ क्या करना है। अपनी सूची फिर से आदेश एक सा देता है और अमूर्त के उच्चतम स्तर को न्यूनतम से तीन तकनीकों को देखो: यह वास्तव में ओएस में एक नया धागा बनाता

:

  1. एक नया धागा मैन्युअल शुरू । आपका कोड उस धागे पर निष्पादित किया जाएगा।

  2. एक BackgroundWorker का उपयोग करना:

    आंतरिक यह कुछ .net ThreadPool कहा जाता है का उपयोग करता है। थ्रेड पूल मूल रूप से उपलब्ध धागे का एक पूल है। आपका कोड उपलब्ध धागे में से एक पर असाइन किया गया है और उस थ्रेड पर चलाया जाता है।

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

    वहाँ ThreadPool सीधे इस तरह के QueueUserWorkItem(...) के रूप में इस्तेमाल करने के अन्य तरीके हैं।

  3. टास्क समानांतर लाइब्रेरी का उपयोग करना:

    यह और भी अधिक अमूर्त है। आप "कार्य" बनाते हैं और टीपीएल को निष्पादित करने के लिए कहते हैं। टीपीएल वास्तव में कितने धागे और प्राथमिकताओं का उपयोग किया जाएगा, इस बारे में सभी चिंताओं को छुपाता है। टीपीएल में थ्रेड का पुन: उपयोग करने और उन्हें विशिष्ट मशीन प्रदर्शन और उपलब्ध CPU संसाधनों के अनुसार प्रबंधित करने की क्षमता है।

    उदाहरण के लिए 100 कार्य दिए गए हैं, एक क्वाड कोर पर टीपीएल 4 धागे उत्पन्न कर सकता है, लेकिन 8 कोर पर यह 8 हो सकता है और प्रत्येक कार्य पूरा होने पर उपलब्ध थ्रेड पर कार्यों को वितरित कर सकता है।

तो आपको प्रश्न का उत्तर देने के लिए। सभी 3 तकनीक धागे का उपयोग करें, लेकिन जैसा कि आप प्रत्येक स्तर ऊपर जाना आप उन धागे पर आपके नियंत्रण और जागरूकता की राशि कम है।

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

3
  1. एक नया थ्रेड शुरू सबसे तीन में से महंगा है, लेकिन आप सबसे संभावनाओं मिलता है। अपार्टमेंट मॉडल और प्राथमिकता की तरह।

  2. टास्क समानांतर पुस्तकालय ThreadPool पर एक काम (जब तक कि एक टास्क अपनी ही थ्रेड की आवश्यकता होगी, के रूप में चिह्नित किया जाता है) चलेंगे और अपवाद संचालन कहते हैं और प्रतीक्षा के लिए: -पूर्ण कार्यक्षमता।

  3. पृष्ठभूमिवर्कर केवल WinForms या WPF से उत्पन्न कार्यों को चलाने के लिए उपयोगी है। यह थ्रेडपूल

  4. अतिरिक्त: थ्रेडपूल का भी उपयोग करता है। एक अलग थ्रेड बनाने के ऊपरी हिस्से को कम कार्यों को चलाने के लिए प्रयुक्त होता है।

+1

+1 'थ्रेडपूल' के लिए +1 – Cornelius

2

धागा बनाना केवल यही है ... आप अपने मुख्य प्रक्रिया थ्रेड के साथ एक साथ चलने के लिए एक थ्रेड उत्पन्न करते हैं।

यदि आप कोई कार्य बनाते हैं तो टीपीएल में यह कार्य चलाने के लिए एक मुक्त थ्रेड खोजने के लिए थ्रेड पूल का उपयोग करेगा। जब आप बहुत सारे कार्यों को बनाते हैं तो यह अधिक कुशल हो सकता है क्योंकि टीपीएल लोड के किसी भी संख्या में लोड को संतुलित करने में सक्षम होता है (संभवतः धागे का # आपके पास कोर के # आधार पर संतुलित होता है, लेकिन मैं इसे निश्चित रूप से नहीं जानता।)

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

अंत में, आपको चुनना होगा कि आपके कार्यक्रम के लिए क्या सही है, लेकिन टीपीएल कार्य का उद्देश्य आपको प्रभावी ढंग से प्रभावी करने की अनुमति देना है शेड्यूल कार्य जिन्हें समानांतर में चलाया जा सकता है जबकि थ्रेड बनाने या पृष्ठभूमि श्रमिकों का उपयोग करना लंबे समय तक चलने वाले परिचालनों के लिए बेहतर हो सकता है या परिदृश्यों के लिए जहां आप पृष्ठभूमि थ्रेड को हमेशा कुछ सिग्नल के लिए इंतजार करना चाहते हैं (क्योंकि मैं वास्तव में एक पंजीकृत Wait का उपयोग करने का सुझाव दूंगा यदि आप ' कुछ घटनाओं को सिग्नल करने की प्रतीक्षा कर रहे हैं।)

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