2010-06-15 14 views
25

बनाम जाहिर .NET 4.0 में TaskFactory.StartNew विधि ThreadPool.QueueUserWorkItem (according to this post, anyway) के लिए एक स्थानापन्न के रूप में करना है। मेरा सवाल सरल है: क्या किसी को पता है क्यों?TaskFactory.StartNew ThreadPool.QueueUserWorkItem

क्या TaskFactory.StartNew बेहतर प्रदर्शन है? क्या यह कम स्मृति का उपयोग करता है? या यह मुख्य रूप से Task कक्षा द्वारा प्रदान की गई अतिरिक्त कार्यक्षमता के लिए है? बाद के मामले में, StartNew में QueueUserWorkItem से अधिक प्रदर्शन है?

मुझे ऐसा लगता है कि वास्तव में StartNew संभावित अधिक स्मृति QueueUserWorkItem से, का प्रयोग करेंगे, क्योंकि यह हर कॉल के साथ एक Task ऑब्जेक्ट और मुझे लगता है कि और अधिक स्मृति आवंटन में परिणाम की उम्मीद करेंगे।

किसी भी मामले में, मुझे यह जानने में दिलचस्पी है कि उच्च प्रदर्शन परिदृश्य के लिए कौन सा उचित है।

उत्तर

2

बस चीजों के दिखने से, कार्य वर्गों को नेट 4 में नई समांतर सुविधाओं के साथ काम करने के लिए डिज़ाइन किया गया था। ऐसा लगता है कि आप कार्य शुरू करने/बनाने के दौरान सीधे Action या Action<T> का उपयोग कर सकते हैं। यह सभी 100% अनुमान है, हालांकि, दस्तावेज़ों के चारों ओर पोकिंग के आधार पर :)।

7

प्रदर्शन एक है ... निर्भर करता है। यदि आप बहुत सारे समानांतर कार्य कर रहे हैं, तो .NET 4 कार्य बेहतर प्रदर्शन करेंगे, साथ ही आपको अधिक बढ़िया अनाज नियंत्रण (अधिक मजबूत रद्दीकरण, एक साथ कई कार्यों पर प्रतीक्षा करने की क्षमता, माता-पिता/बाल कार्य संबंध बनाने की क्षमता, क्षमता LongRunning, आदि .. आदि .. निर्दिष्ट करें ..)

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

अधिक स्मृति का उपयोग कर के रूप में। प्रत्येक थ्रेड में कम से कम 1 एमबी मेमोरी होती है, एक टास्क ऑब्जेक्ट को स्टोर करने के लिए उपयोग की जाने वाली छोटी राशि अपरिहार्य है। मैं वास्तव में सोचता हूं कि आपकी पिछली चिंताएं हैं।

+0

AFAIK डिफ़ॉल्ट TaskScheduler एक ThreadPool का उपयोग करता है और उन दोनों के बीच कोई अंतर नहीं है जब आप मल्टी कोर समर्थन चाहते हैं। पुरुष भी कुछ परीक्षण किया गया है: http://stackoverflow.com/a/5219311/152291 – prostynick

6

TaskFactory.StartNew एक उच्च प्रदर्शन परिदृश्य के लिए अधिक उपयुक्त है।

आपको सिस्टम में कक्षाओं के सेट द्वारा उत्पादकता लाभ प्राप्त होता है। थ्रेडिंग। कार्य और उनके डिजाइन में जाने वाली देखभाल + समांतर लूप और विकल्पों के साथ एकीकरण।

आपको एक प्रदर्शन लाभ भी मिलेगा क्योंकि सिस्टम। थ्रेडिंग टास्क थ्रेड पूल में काम करने के शीर्ष पर बनाए जाते हैं जो इलाके के लिए बेहतर होता है (जब यह मायने रखता है)।

-रिक

+0

हाय रिक, क्या आप मुझे बता सकते हैं, जब मैं Task.Factory.StartNew उपयोग करते हैं, यह एक पूल से धागा लेता है और मेरे पास है मेरे पूल में 1 कम धागा? धन्यवाद –

+1

Task.Factory.StartNew .net थ्रेड पूल का प्रयोग करेंगे तो हाँ थ्रेड पूल – Rick

+0

से आएगा वहाँ किसी भी तरह से नया थ्रेड जो थ्रेड पूल से नहीं लिया जाएगा शुरू करने के लिए है? –

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