2012-02-08 11 views
68

क्या बनामThreadPool.QueueUserWorkItem बनाम Task.Factory.StartNew

Task.Factory.StartNew 

नीचे

ThreadPool.QueueUserWorkItem 

के बीच का अंतर उपरोक्त कोड कुछ लंबी चल रहा कार्य के लिए 500 बार कहा जाता है कि यह सब क्या मतलब है है धागा पूल धागे उठाए जाएंगे?

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

उत्तर

84

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

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

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

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

संपादित करें: के रूप में टिप्पणी में बताया गया है, यह भी PFX टीम के ब्लॉग पोस्ट choosing between the TPL and the thread pool पर देखें:

अंत में, मैं दोहराना करेंगे कि कौन-CLR टीम के ThreadPool डेवलपर पहले से ही कहा है:

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

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

+4

मैं कठिन तेजी से सावधान कर रहा हूँ नियम है कि 'टास्क क्रिएशनऑप्शन। लोंगरिंग' हमेशा थ्रेड-पूल से बचेंगे। यह कार्यान्वयन गारंटी की तुलना में अधिक निर्देशक प्रतीत होता है। क्या मैं उस पर ऑफ-बेस हूं? – Marc

+1

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

+0

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

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