ThreadPool.QueueUserWorkItem vs Task.Factory.StartNew


79

नीचे के बीच क्या अंतर है

ThreadPool.QueueUserWorkItem

बनाम

Task.Factory.StartNew

यदि उपरोक्त कोड को कुछ लंबे समय तक चलने वाले कार्य के लिए 500 बार कहा जाता है तो क्या इसका मतलब है कि सभी थ्रेड पूल थ्रेड उठाए जाएंगे?

या टीपीएल (2 वां विकल्प) पर्याप्त स्मार्ट होगा बस थ्रेडर्स को कम या प्रोसेसर की संख्या के बराबर लेने के लिए?

जवाबों:


93

यदि आप TPL के साथ एक लंबे समय से चलने वाला कार्य शुरू करने जा रहे हैं, तो आपको निर्दिष्ट करना चाहिए TaskCreationOptions.LongRunning, जिसका अर्थ है कि यह थ्रेड-पूल पर इसे शेड्यूल नहीं करता है । (संपादित करें: के रूप में टिप्पणी में बताया गया है, इस है एक अनुसूचक विशेष निर्णय, और एक कठिन और तेजी से गारंटी नहीं है, लेकिन मुझे आशा है कि चाहते हैं कि किसी भी समझदार उत्पादन अनुसूचक एक धागा पूल पर लंबे समय से चल रहे कार्यों का समय निर्धारण से बचने होगा।)

आपको निश्चित रूप से थ्रेड पूल पर बड़ी संख्या में लंबे समय तक चलने वाले कार्यों का शेड्यूल नहीं करना चाहिए। मेरा मानना ​​है कि इन दिनों थ्रेड पूल का डिफ़ॉल्ट आकार बहुत बड़ा है (क्योंकि इसका अक्सर इस तरह से दुरुपयोग किया जाता है), लेकिन मौलिक रूप से इसका उपयोग इस तरह नहीं किया जाना चाहिए।

थ्रेड पूल की बात यह है कि नए थ्रेड बनाने से बड़े हिट लेने वाले छोटे कार्यों से बचें , जब वे वास्तव में चल रहे होते हैं। यदि कार्य लंबे समय तक चल रहा है, तो एक नया धागा बनाने का प्रभाव वैसे भी अपेक्षाकृत कम होगा - और आप संभावित रूप से थ्रेड पूल थ्रेड्स से बाहर चलना समाप्त नहीं करना चाहते हैं। (अब इसकी संभावना कम है, लेकिन मैंने इसे .NET के पुराने संस्करणों पर अनुभव किया है।)

निजी तौर पर अगर मैं विकल्प था, मैं निश्चित रूप से इस आधार पर कि पर TPL प्रयोग करेंगे Taskएपीआई बहुत अच्छा है - लेकिन है TPL बताने के लिए है कि आप काम के लिए एक लंबे समय के लिए चलाने के लिए उम्मीद याद है।

संपादित करें: टिप्पणियों के अनुसार, TFX और थ्रेड पूल के बीच चयन पर PFX टीम के ब्लॉग पोस्ट को भी देखें :

अंत में, मैं दोहराता हूं कि सीएलआर टीम के थ्रेडपूल डेवलपर ने पहले ही क्या कहा है:

Task is now the preferred way to queue work to the thread pool.

संपादित करें: टिप्पणियों से भी, यह न भूलें कि टीपीएल आपको कस्टम शेड्यूलर्स का उपयोग करने की अनुमति देता है , यदि आप वास्तव में चाहते हैं ...


4
मैं कठिन तेज नियम से सावधान हूं जो TaskCreationOptions.LongRunningहमेशा थ्रेड-पूल से बचा रहेगा। यह एक कार्यान्वयन गारंटी की तुलना में एक निर्देश के अधिक लगता है। क्या मैं उस पर आधारित हूं?
मार्क

1
@ मर्क: ठीक है, यह शेड्यूलर पर निर्भर है - लेकिन यह थ्रेड पूल, आईएमओ पर स्पष्ट रूप से लंबे समय तक चलने वाले कार्यों को शेड्यूल करने के लिए एक बहुत ही पागल शेड्यूलर होगा।
जॉन स्कीट

बस थोड़ी और जानकारी जोड़ने के लिए - blogs.msdn.com/b/pfxteam/archive/2009/10/06/9903475.aspx
ब्रैड सेमराद

@ ब्रैड: धन्यवाद, मेरे जवाब के लिए एक लिंक जोड़ देगा।
जॉन स्कीट

1
मैं यह भी जोड़ना चाहता हूं कि TPL आपको अपने स्वयं के शेड्यूलर को निर्दिष्ट करने की अनुमति देता है, जिसमें कस्टम शेड्यूलर्स भी शामिल हैं जो आपको अपनी स्वयं की संगोष्ठी
Chris Shain
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.