यदि आप TPL के साथ एक लंबे समय से चलने वाला कार्य शुरू करने जा रहे हैं, तो आपको निर्दिष्ट करना चाहिए TaskCreationOptions.LongRunning
, जिसका अर्थ है कि यह थ्रेड-पूल पर इसे शेड्यूल नहीं करता है । (संपादित करें: के रूप में टिप्पणी में बताया गया है, इस है एक अनुसूचक विशेष निर्णय, और एक कठिन और तेजी से गारंटी नहीं है, लेकिन मुझे आशा है कि चाहते हैं कि किसी भी समझदार उत्पादन अनुसूचक एक धागा पूल पर लंबे समय से चल रहे कार्यों का समय निर्धारण से बचने होगा।)
आपको निश्चित रूप से थ्रेड पूल पर बड़ी संख्या में लंबे समय तक चलने वाले कार्यों का शेड्यूल नहीं करना चाहिए। मेरा मानना है कि इन दिनों थ्रेड पूल का डिफ़ॉल्ट आकार बहुत बड़ा है (क्योंकि इसका अक्सर इस तरह से दुरुपयोग किया जाता है), लेकिन मौलिक रूप से इसका उपयोग इस तरह नहीं किया जाना चाहिए।
थ्रेड पूल की बात यह है कि नए थ्रेड बनाने से बड़े हिट लेने वाले छोटे कार्यों से बचें , जब वे वास्तव में चल रहे होते हैं। यदि कार्य लंबे समय तक चल रहा है, तो एक नया धागा बनाने का प्रभाव वैसे भी अपेक्षाकृत कम होगा - और आप संभावित रूप से थ्रेड पूल थ्रेड्स से बाहर चलना समाप्त नहीं करना चाहते हैं। (अब इसकी संभावना कम है, लेकिन मैंने इसे .NET के पुराने संस्करणों पर अनुभव किया है।)
निजी तौर पर अगर मैं विकल्प था, मैं निश्चित रूप से इस आधार पर कि पर TPL प्रयोग करेंगे Task
एपीआई बहुत अच्छा है - लेकिन है TPL बताने के लिए है कि आप काम के लिए एक लंबे समय के लिए चलाने के लिए उम्मीद याद है।
संपादित करें: टिप्पणियों के अनुसार, TFX और थ्रेड पूल के बीच चयन पर PFX टीम के ब्लॉग पोस्ट को भी देखें :
अंत में, मैं दोहराता हूं कि सीएलआर टीम के थ्रेडपूल डेवलपर ने पहले ही क्या कहा है:
Task is now the preferred way to queue work to the thread pool.
संपादित करें: टिप्पणियों से भी, यह न भूलें कि टीपीएल आपको कस्टम शेड्यूलर्स का उपयोग करने की अनुमति देता है , यदि आप वास्तव में चाहते हैं ...
TaskCreationOptions.LongRunning
हमेशा थ्रेड-पूल से बचा रहेगा। यह एक कार्यान्वयन गारंटी की तुलना में एक निर्देश के अधिक लगता है। क्या मैं उस पर आधारित हूं?