2011-11-28 10 views
18

मैंने धागे के बजाए कार्य का उपयोग करने के लिए अपना कोड अपडेट किया ....क्या मुझे .NET 4.0 में कार्य बनाम थ्रेड का उपयोग करने में कोई अंतर दिखाना चाहिए?

मेमोरी उपयोग और सीपीयू को देखते हुए मुझे बहु-कोर पीसी पर कोई सुधार नहीं दिखता है, क्या यह अपेक्षित है?

मेरा आवेदन अनिवार्य रूप से ऊपर धागे/विभिन्न वस्तुओं में कार्य शुरू होता है जब इसे चलाता ...

सभी मैं कर रहा हूँ है एक सरल

Task a = new Task(...) 
a.Start(); 
+4

"मुझे कोई सुधार नहीं है" यह वास्तविक कोड पर बहुत निर्भर करेगा ... आप भी गिरावट देख सकते थे। –

+1

'कार्य 'जादू वर्ग नहीं हैं। अंत में वे 'थ्रेड' भी हैं, –

+0

मैं यद्यपि कार्य थ्रेड के विपरीत बहु-कोर वातावरण के बारे में जानते हैं, इसलिए यह पता चलेगा कि बहु-कोर पर स्वयं को कैसे ठीक से डिस्ट्रिब्यूट करना है। चूंकि वे थ्रेडपूल का उपयोग करने के बाद से बनाए जाने की आवश्यकता नहीं है, इसलिए वे अधिक स्मृति प्रभावशाली होंगे। – TheWommies

उत्तर

28

वहाँ धागे के बजाय कार्य का उपयोग करने के लिए विभिन्न निहितार्थ हैं , लेकिन प्रदर्शन के एक प्रमुख एक नहीं है कुछ मुख्य अंतर (यह मानते हुए आप धागे की बड़ी संख्या बनाने नहीं थे।):

  1. डिफ़ॉल्ट TaskScheduler धागा पूलिंग का उपयोग करेगा, इसलिए कुछ टा अन्य लंबित कार्य पूरा होने तक sks शुरू नहीं हो सकता है। यदि आप सीधे थ्रेड का उपयोग करते हैं, तो प्रत्येक उपयोग एक नया थ्रेड शुरू करेगा।
  2. जब कार्य में कोई अपवाद होता है, तो यह एक समग्र अपवाद में लपेटा जाता है कि कॉल को पूरा करने के लिए प्रतीक्षा करने पर या कोड पर निरंतरता दर्ज करने पर कोड कॉलिंग प्राप्त हो सकती है। ऐसा इसलिए है क्योंकि आप कई कार्यों को पूरा करने के लिए इंतजार कर सकते हैं जैसे कि कई अपवादों को फेंक दिया जा सकता है और समेकित किया जा सकता है।
  3. आप एक बिना क्रिया का अपवाद एक टास्क द्वारा फेंका का पालन नहीं करते हैं, तो यह (ठीक है, हो सकता है) अंत में टास्क की finalizer, जो विशेष रूप से बुरा है द्वारा फेंक दिया जाएगा। मैं हमेशा TaskScheduler.UnobservedTaskException ईवेंट को हुक करने की अनुशंसा करता हूं ताकि एप्लिकेशन कम से कम इन विफलताओं को लॉग इन कर सकें। यह थ्रेड अपवादों से अलग है, जो AppDomain.UnhandledException ईवेंट में दिखाई देता है।
+0

वास्तव में सहायक सारांश, धन्यवाद! –

+0

धन्यवाद, यह एक अच्छा अवलोकन है। मैं अब पहली बार शोध कर रहा हूं, यह टास्कशेड्यूलर का उपयोग करने में दिलचस्प लगता है। – Kosko

+1

@ कोस्को, टास्कशेड्यूलर का एक आम उपयोग है [टास्कशेड्यूलर। फ्रॉम कंटेंट सिंक्रनाइज़ेशन कॉन्टेक्स्ट] (http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskscheduler.fromcurrentsynchronizationcontext.aspx), जो कार्यों को शेड्यूल करता है सिंक्रनाइज़ेशन संदर्भ (आमतौर पर यूआई थ्रेड।) यह आमतौर पर कार्य पर निरंतरता दर्ज करते समय उपयोग किया जाता है, ताकि थ्रेड पूल की बजाय यूआई थ्रेड में निरंतरता चलती है। यह आपके यूआई अपडेट विधियों में बहुत बदसूरत कोड से बचने में मदद कर सकता है। –

3

Takss बनाम थ्रेड का एक बड़ा सुधार यह है कि आप आसानी से कार्यों की श्रृंखला बना सकते हैं। जब आप पिछले कार्य ("ऑनस्यूप", "ऑनरर", a.s.o.) के बाद कोई कार्य शुरू करना चाहते हैं तो आप निर्दिष्ट कर सकते हैं और आप निर्दिष्ट कर सकते हैं कि सिंक्रनाइज़ेशन संदर्भ स्विच होना चाहिए या नहीं। इससे आपको बाकक्राउंड में लंबे समय तक चलने का काम चलाने का मौका मिलता है और इसके बाद यूआई थ्रेड पर यूआई संदर्भ कार्य करता है।

8

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

क्या अच्छा है Task के बारे में नई बातें आप के साथ ContinueWith

  • रद्द
  • पदानुक्रम
  • आदि

    • संरचना उन लोगों के साथ कर सकते हैं ...
  • +2

    टीपीएल कोड obfuscating bloat से छुटकारा पाता है। यह एपीआई है कि प्रत्येक डेवलपर लिखना चाहता है लेकिन ऐसा करने के लिए समय नहीं है। – Gusdor

    0

    आप कर रहे हैं .NET 4.0 का उपयोग करके आप समांतर का उपयोग कर सकते हैं।इसलिए

    Parallel.Invoke(()=> { 
        // What ever code you add here will get threaded. 
    }); 
    

    की तरह विधि आह्वान के लिए अधिक जानकारी देखने के http://msdn.microsoft.com/en-us/library/dd992634.aspx

    +1

    तो क्या? क्या आपने सवाल पढ़ा है? 'मेमोरी यूज और सीपीयू को देखते हुए मुझे बहु-कोर पीसी पर कोई सुधार नहीं दिखता है, क्या यह अपेक्षित है?' –

    +0

    यह मेरी समझ है कि समांतर। इन्वोक के पास बेहतर मल्टीकोर उपयोग है। अब मैं इसके बारे में गलत हो सकता हूं और यदि ऐसा है तो कृपया मुझे शिक्षित करें। –

    +0

    1) शायद, 'समानांतर' इन्वोक ''कार्य' के साथ लागू किया गया है? 2) 'क्या यह अपेक्षित है?' –

    0

    आप अगर अपने मूल या परिवर्तित कोड पूरी तरह से नहीं utlize सीपीयू कर अंतर देखना होगा। अर्थात। यदि मूल कोड हमेशा थ्रेड की संख्या को 2 तक सीमित करता है, तो क्वाड-कोर मशीन पर यह मैन्युअल रूप से बनाए गए धागे के साथ लगभग 50% लोड पर चलाएगा और संभावित रूप से कार्यों के साथ 100% भार (यदि आपके कार्यों को क्रियात्मक रूप से पैरालाइज्ड किया जा सकता है)। तो ऐसा लगता है कि आपका मूल कोड प्रदर्शन बिंदु से उचित था, या दोनों implemetaion CPU के समान underutiliztion दिखा रहे मुद्दों का सामना करना पड़ता है।

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