धागे बनाना - टास्क.फैक्टरी। नया बनाम नया धागा ()


102

मैं सिर्फ .net 4 में नई थ्रेडिंग और समानांतर पुस्तकालयों के बारे में सीख रहा हूं

अतीत में मैं ऐसा एक नया सूत्र बनाऊंगा (उदाहरण के लिए):

DataInThread = new Thread(new ThreadStart(ThreadProcedure));
DataInThread.IsBackground = true;
DataInThread.Start();

अब मैं कर सकता हूँ:

Task t = Task.Factory.StartNew(() =>
{
   ThreadProcedure();
});

यदि कोई है तो क्या अंतर है?

धन्यवाद


1
थ्रेड पूल शेड्यूलर कैसे काम करता है, इसके बारे में आपको थोड़ा ध्यान केंद्रित करना होगा। यह एक बड़ा अंतर बना सकता है लेकिन यह सब इस बात पर निर्भर करता है कि आप वास्तव में धागे के अंदर क्या करते हैं।
हंस पसंत

जवाबों:


79

एक बड़ा अंतर है। कार्य थ्रेडपूल पर शेड्यूल किए गए हैं और यहां तक ​​कि अगर एप्रोपिएट को सिंक्रोनस निष्पादित किया जा सकता है।

यदि आपके पास लंबे समय तक चलने वाला पृष्ठभूमि का काम है, तो आपको सही टास्क विकल्प का उपयोग करके इसे निर्दिष्ट करना चाहिए।

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


5
नहीं यह नहीं है। यह सिर्फ कार्य शुरू करता है। यह कार्य को थ्रेड पूल में शामिल कर सकता है या इसे सिंक्रोनाइज़ कर सकता है। TPL आपको थ्रेड्स /
कॉन्सिरेन्सी को

10
वहाँ TaskCreationOptions.LongRunning विकल्प है कि हमेशा एक और धागा पैदा करेगा, लेकिन पूरे बिंदु क्यों आप एक और धागा की जरूरत है? यदि आप समानांतर में कुछ करना चाहते हैं (मुख्य कार्य sth। जबकि टास्क चलता है) यह एक अनुकूलित पुस्तकालय तय करने के लिए बेहतर है कि सिस्टम संसाधनों का उपयोग कैसे किया जाए जैसे कि सबसे कुशल तरीके से ऐसा करने के लिए।
sanosdole

3
यह एमएसडीएन लेख बताता है कि कैसे कार्य निर्धारित हैं। यह लंबे समय तक चलने वाली और इनलाइनिंग (तुल्यकालिक निष्पादन) को कवर करता है। msdn.microsoft.com/en-us/library/dd997402.aspx
sanosdole

2
@sming बिंदु यह है कि आप समवर्ती प्रक्रिया करना चाहते हैं (UI को ब्लॉक नहीं कर रहे हैं) यह नहीं कि आप एक नया सूत्र चाहते हैं। थ्रेडपूल UI थ्रेड को ब्लॉक नहीं करेगा, लेकिन आप थ्रेड्स बनाकर मैन्युअल रूप से कर सकने वाले बैकग्राउंड थ्रेड्स को अधिक कुशल बना सकते हैं। यह मन की प्रक्रिया में परिवर्तन है जो टीपीएल का परिचय देता है। लगता है कि धागे, समवर्ती कार्यों को नहीं सोचते हैं।
sanosdole

4
@sming क्षमा करें, वह वाक्य थोड़ा बहुत कठिन था। कार्यों के समकालिक निष्पादन को इनलाइनिंग कहा जाता है। UI थ्रेड से थ्रेडपूल (डिफ़ॉल्ट शेड्यूलर) पर किसी कार्य को शेड्यूल करते समय यह नहीं होगा। यह केवल तभी होगा जब परिवेश के शेड्यूलर ('टास्कसिड्यूलर.कंट्रल') एक कार्य के शेड्यूलर के समान है जिसे आप कहते हैं '.Wait ()' पर। जैसा कि '.Wait ()' ब्लॉक हो रहा है, यह वैसे भी UI को ब्लॉक करेगा। संक्षिप्त: कॉल का इंतजार न करें और इसे सिंक्रोनाइज़ नहीं किया जाएगा।
sanosdole

74

कार्य आपको कार्य की सभी अच्छाई देता है API:

  • निरंतरता जोड़ना ( Task.ContinueWith)
  • कई कार्यों के पूरा होने की प्रतीक्षा (या तो सभी या किसी भी)
  • कार्य में त्रुटियों को पकड़ना और बाद में उनसे पूछताछ करना
  • रद्दीकरण को पकड़ना (और रद्द करने के लिए आपको निर्दिष्ट करने की अनुमति देना)
  • संभावित रूप से रिटर्न वैल्यू है
  • C # 5 में वेट का उपयोग करना
  • शेड्यूलिंग पर बेहतर नियंत्रण (यदि यह लंबे समय तक चलने वाला है, तो जब आप कार्य बनाते हैं तो कार्य शेड्यूलर को ध्यान में रख सकते हैं)

ध्यान दें कि दोनों स्थितियों में आप विधि समूह रूपांतरण के साथ अपना कोड थोड़ा सरल बना सकते हैं:

DataInThread = new Thread(ThreadProcedure);
// Or...
Task t = Task.Factory.StartNew(ThreadProcedure);

8
+1। मैं Threadइसकी तुलना में बहुत कम-स्तरीय जोड़ना चाहता हूं Task(मेरे पास एक ब्लॉग पोस्ट है जो विस्तार से जाती है)। मैं ग्रैंड रैपिड्स देवडे में "वास्तविक दुनिया में कार्य का उपयोग कर" एक प्रकार की बात दे रहा हूं । बात को "थ्रेड डेड" कहा जाता है, क्योंकि अब Thread(जब तक आप लागू नहीं कर रहे हैं TaskScheduler) की कोई आवश्यकता नहीं है ।
स्टीफन क्लीयर

@StephenCleary, मेरा मानना ​​है कि आप का मतलब Threadमर चुका है, जब यह पृष्ठभूमि के धागे के रूप में इस्तेमाल होने की बात आती है?
ईबे

1
@ebb: नहीं, मैं अपनी पहली टिप्पणी में वर्णित मजबूत स्थिति को लेता हूं। ऐसा कुछ नहीं Thread(या BackgroundWorker) किया जा सकता है जो अधिक सुंदर ढंग से Taskऔर एक उपयुक्त तरीके से नहीं किया जा सकता है TaskScheduler
स्टीफन क्लीयर

1
@StephenCleary, बिना उपयोग किए आप एक समर्पित धागा कैसे बनाएंगे Thread?
ईबब

4
@ebb: "डेडिकेटेड थ्रेड" मेरे लिए स्पष्ट नहीं है। यदि आप Taskकिसी विशिष्ट थ्रेड पर चलना चाहते हैं , तो एक उपयुक्त TaskScheduler- जैसे, का उपयोग करें AsyncContextThread। हालांकि, यह आमतौर पर आवश्यक नहीं है; SynchronizationContext, ThreadPoolऔर ConcurrentExclusiveSchedulerPairशेड्यूलर ज्यादातर कार्यक्रमों के लिए पर्याप्त हैं।
स्टीफन क्लीयर

12

पहले मामले में आप बस एक नया धागा शुरू कर रहे हैं जबकि दूसरे मामले में आप थ्रेड पूल में प्रवेश कर रहे हैं।

थ्रेड पूल नौकरी शेयर और रीसायकल धागे के लिए है। यह हर बार कुछ मिलीसेकंड खोने से बचने के लिए हमें एक नया धागा बनाने की आवश्यकता है।

थ्रेड पूल में प्रवेश करने के कई तरीके हैं:

  • साथ TPL (टास्क समानांतर लाइब्रेरी) की तरह तुमने किया था
  • ThreadPool.QueueUserWorkItem पर कॉल करके
  • एक प्रतिनिधि पर BeginInvoke को कॉल करके
  • जब आप एक BackgroundWorker का उपयोग करते हैं

1

आपके कोड का पहला ब्लॉक CLR को आपके लिए एक थ्रेड (कहते हैं। T) बनाता है जिसे बैकग्राउंड के रूप में चलाया जा सकता है (टी शेड्यूल करते समय थ्रेड पूल थ्रेड का उपयोग करें)। संक्षिप्त रूप में, आप स्पष्ट रूप से सीएलआर को आपसे कुछ करने के लिए एक धागा बनाने के लिए कहते हैं और शुरू करने के लिए थ्रेड पर स्टार्ट () विधि कहते हैं।

आपका दूसरा ब्लॉक कोड वही करता है लेकिन थ्रेड बनाने की जिम्मेदारी प्रतिनिधि (निहित रूप से सौंपने) की जिम्मेदारी (पृष्ठभूमि- जो फिर से थ्रेड पूल में चलती है) और स्टार्ट फैक्ट्री के माध्यम से टास्क फैक्ट्री कार्यान्वयन में प्रारंभ करें।

यह दिए गए कोड ब्लॉक के बीच एक त्वरित अंतर है। ऐसा कहने के बाद, कुछ विस्तृत अंतर हैं जो आप मेरे साथी योगदानकर्ताओं से पूछ सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.