5

मैं जानना चाहता हूं कि उन कार्यों के लिए क्या उपयोग करना है जिन्हें प्रदर्शन की आवश्यकता है। Backgroundworker, Thread या ThreadPool?थ्रेड/थ्रेडपूल या पृष्ठभूमिवर्क

मैं अब तक थ्रेड के साथ काम कर रहा हूं, लेकिन मुझे अपने अनुप्रयोगों की गति में सुधार करने की आवश्यकता है।

+5

यह उन पर निर्भर करता है कि उनका उपयोग कैसे किया जाए, इसका उपयोग न करें। – I4V

उत्तर

13

BackgroundWorker थ्रेड पूल थ्रेड के समान ही है। यह यूआई थ्रेड पर ईवेंट चलाने की क्षमता जोड़ता है। प्रगति दिखाने और परिणाम के साथ यूआई को अद्यतन करने के लिए बहुत उपयोगी है। तो इसका सामान्य उपयोग यूआई को फ्रीजिंग से रोकने के लिए है जब काम करने की जरूरत है। प्रदर्शन पहला लक्ष्य नहीं है, चल रहा कोड असीमित रूप से है। इस पैटर्न को बाद में .NET संस्करणों में कार्य <> कक्षा और async/प्रतीक्षा कीवर्ड द्वारा विस्तारित किया गया है।

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

हां, किसी प्रोग्राम के प्रदर्शन को बेहतर बनाने के लिए धागे का उपयोग करना भी संभव है। आप थ्रेड या कार्य <> का उपयोग करके ऐसा करेंगे जो टास्ककंटिन्यूशनऑप्शन का उपयोग करता है। लोंगरिंग। कुछ कठोर आवश्यकताओं वास्तव में एक प्रदर्शन में सुधार लाने के लिए कर रहे हैं, वे बहुत कठोर हैं:

  • आप अधिक एक थ्रेड से की जरूरत है। एक आदर्श मामले में, नौकरी पाने के लिए दो धागे आधे समय की आवश्यकता हो सकती है। और कम, आप जितने अधिक धागे का उपयोग करते हैं। उस आदर्श के करीब हालांकि मुश्किल है, यह असीमित पैमाने पर नहीं है। जानकारी के लिए Google "Amdahl कानून"।
  • आपको एक प्रोसेसर वाली मशीन की आवश्यकता है जिसमें एकाधिक कोर हैं। इन दिनों पाने में आसान है। आपके द्वारा बनाए गए धागे की संख्या उपलब्ध कोर की संख्या से अधिक नहीं होनी चाहिए। अधिक उपयोग करना आमतौर पर निचला प्रदर्शन होगा।
  • आपको ऐसे प्रकार की नौकरी की आवश्यकता है जो गणना की जाती है, प्रोसेसर का निष्पादन इंजन बाधित संसाधन हो। यह काफी आम है लेकिन निश्चित रूप से कोई स्लैमडंक नहीं है। कई नौकरियां वास्तव में I/O थ्रूपुट द्वारा सीमित होती हैं, जैसे फ़ाइल या डीबेस क्वेरी से पढ़ना। या उस दर से सीमित हैं जिस पर प्रोसेसर रैम से डेटा पढ़ सकता है। ऐसी नौकरियों को थ्रेड से लाभ नहीं होता है, आपके पास एकाधिक निष्पादन इंजन उपलब्ध होंगे लेकिन आपके पास अभी भी केवल एक डिस्क और एक मेमोरी बस है।
  • आपको एक एल्गोरिदम की आवश्यकता है जो सिंक्रनाइज़ेशन के लिए शायद ही कभी आवश्यकता के बिना कई धागे में काम वितरित कर सके। आमतौर पर हल करने में मुश्किल समस्या होती है, कई एल्गोरिदम प्रकृति में बहुत अनुक्रमिक होते हैं और आसानी से समानांतर नहीं होते हैं।
  • कोड को स्थिर और अच्छी तरह से प्रदर्शन करने के लिए आपको समय और धैर्य की आवश्यकता होगी। थ्रेडेड कोड लिखना हार्ड और एक थ्रेडिंग रेस जो महीने में एक बार आपके प्रोग्राम को क्रैश करता है, या कभी-कभी एक अवैध परिणाम उत्पन्न करता है, यह एक प्रमुख समय सिंक हो सकता है।
+0

महान उत्तर! मुझे लगता है कि मुझे जो चाहिए वह मिला। मैं इस सवाल को कैसे बंद करूं? (यह मेरे लिए नया है)। – user2468035

+0

@user - बस इसे उत्तर दें चिह्नित करें। आपके प्रश्न का उत्तर देने वाले पोस्ट के बाईं ओर स्थित चेक-चिह्न पर क्लिक करें। –

+0

आप लंबे समय तक चलने वाले कार्यों के लिए पृष्ठभूमिवर्कर का उपयोग न करें (और इसके बजाय 'थ्रेड' या' टास्क 'का उपयोग करें)। क्या ऐसा इसलिए है क्योंकि यह थ्रेड/टास्क की तुलना में धीमी है, या यह स्मृति से संबंधित है, या ऐसा इसलिए है क्योंकि यह सिस्टम को नीचे दबाता है, या यह कोई अन्य मुद्दा है? आइए लगभग 4-20 कोर/धागे (भौतिक कोर से मिलान करने के लिए) के साथ एक शर्मनाक-समानांतर समस्या मानें, और जहां समस्या हल करने में कुछ मिनट लग सकते हैं। –

0

थ्रेड में सीपीयू-गहन कार्यों को शुरू करने के लिए ढांचा आपकी समस्या के लिए अप्रासंगिक है, जब तक कि आपके पास अत्यधिक-छोटे-छोटे उप-कार्य नहीं होते हैं।

आपको अपने काम को उप-कार्य में विभाजित करने की आवश्यकता है जिसे समानांतर में निष्पादित किया जा सकता है जब आपके पास एक से अधिक CPU ऐसा करने के लिए होते हैं।

+0

धन्यवाद, यह वास्तव में गति में वृद्धि हुई है। यह एक ही समय में कई कार्यों को कर रहा है जिसने मेरे प्रदर्शन में सुधार किया है। धन्यवाद फिर से – user2468035

0

यह विकल्प वास्तव में कोई फर्क नहीं पड़ता। BackgroundWorker एक थ्रेडपूल थ्रेड है ताकि वैसे भी कोई फर्क नहीं पड़ता। हालांकि, आप ThreadPool.SetMaxThreads के साथ थ्रेड की संख्या को अनुकूलित करने का प्रयास कर सकते हैं।

और आप सिस्टम का उपयोग करना चाह सकते हैं। थ्रेडिंग। टास्क क्लास जो समांतर निष्पादन को अनुकूलित करने में मदद कर सकती है।

+0

बहुत बहुत धन्यवाद, मैं अभी कोशिश कर रहा हूं – user2468035

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