2012-01-30 13 views
10

मैं एक कार्य प्रोजेक्ट के लिए कार्य समानांतर लाइब्रेरी के उपयोग की खोज कर रहा हूं और लंबे समय तक चलने वाले कार्यों के फायदे/नुकसान को समझना चाहता हूं। मुझे अभी तक एक वास्तविक जीवन उदाहरण नहीं मिला है, बस इसके पीछे सिद्धांत को समझना चाहते हैं।कार्य समानांतर लाइब्रेरी - एकाधिक निरंतर कार्य बनाम लंबे समय तक चलने वाला कार्य

एमएसडीएन पृष्ठों के बारे में task schedulers और यह SO question कहता है, ऐसा लगता है कि जितना संभव हो सके लंबे समय तक चलने वाले कार्यों से बचने के लिए सबसे अच्छा है ताकि आप थ्रेडपूल के बाहर धागे नहीं बना रहे हों। लेकिन कहते हैं कि तुम एक काम जो एक लंबे समय पूरा करने के लिए ले जा रहा था था, तब इस की:

Task.Factory.StartNew(() => DoTimeConsumingWork(), TaskCreationOptions.LongRunning) 

आप कोशिश करते हैं और काम की तेज इकाइयों छोटे में अपने काम को विभाजित, और कार्य निरंतरता का उपयोग करें, जैसे जा सका यह:

Task.Factory 
    .StartNew(() => DoWorkPart1()) 
    .ContinueWith(t => DoWorkPart2()) 
    .ContinueWith(t => DoWorkPart3()) 
    //...etc 

क्या यह दृष्टिकोण अब और अधिक फायदेमंद होगा या यह हासिल करने की कोशिश कर रहा है इसके लिए यह अधिक है?

+0

यह वास्तव में * लंबे * द्वारा आपके मतलब पर निर्भर करता है। –

उत्तर

5

यह प्रतीत होता है जैसे कि यह सबसे अच्छा है से बचने के लिए जितना संभव हो सके लंबे समय तक चलने वाले कार्यों

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

आप कोशिश करते हैं और छोटे, काम एक

आप कर सकते हैं, तो यह कर के तेज इकाइयों में अपने काम को विभाजित किया जा सका। लेकिन अल taks इतनी आसानी से अलग नहीं हैं।

+0

मैं मानता हूं कि सभी एल्गोरिदम को छोटे हिस्सों में बहुत आसानी से विभाजित नहीं किया जा सकता है। लेकिन अगर आप कर सकते हैं, तो ऐसा करना बेहतर होगा? मैं अनुमान लगा रहा हूं कि यह टीपीएल का उपयोग शेड्यूलर की तुलना में बेहतर होगा, क्या मैं सही हूं? –

+0

यह बेहतर हो सकता है, लेकिन यह निश्चित नहीं है। मैं आमतौर पर बहुत ज्यादा परेशान नहीं होता। आप नहीं जानते (नहीं कर सकते) अगर यह एक अतिरिक्त थ्रेड की ओर जाता है। –

3

जब आप TaskCreationOptions.LongRunning निर्दिष्ट करते हैं तो यह ज्यादातर थ्रेड पूल के बाहर से एक समर्पित धागा निर्दिष्ट करता है।

मैं बस BackgroundWorker वर्ग जो सुनिश्चित करें कि आपके लंबी चलने कार्य थ्रेड पूल से एक धागे के बजाय एक अलग समर्पित धागे पर दौड़ा दिया जाएगा बनाता है के लिए जाना सुझाव है

+1

टास्क क्रिएशनऑप्शन। लोंगरिंगिंग आमतौर पर एक समर्पित थ्रेड बनने का कारण बनता है। – dtb

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