2014-09-14 11 views
13

डिफ़ॉल्ट रूप से, सीएलआर पूल किए गए धागे पर कार्य चलाता है, जो लघु-चलने वाले गणना-बाध्य कार्य के लिए आदर्श है। लंबे समय तक चल रहा है और संचालन रोकने के लिए, आप एक जमा धागे के उपयोग के रूप में निम्नानुसार रोका जा सकता है:"लंबे समय से चलने वाले कार्यों" का क्या अर्थ है?

Task task = Task.Factory.StartNew (() => ..., 
TaskCreationOptions.LongRunning); 

मैं विषय के बारे में पढ़ रहा हूँ thread और task। क्या आप मुझे समझा सकते हैं कि "लंबा [er] -running" और "शॉर्ट-रनिंग" कार्य क्या हैं?

+1

मुझे लगता है कि प्रमुख मुद्दा अवरुद्ध करने की संभावना है लघु या लंबे समय के रूप प्रासंगिक नहीं है –

+0

मैं यहाँ @DavidHeffernan के साथ समझौते में हूँ –

उत्तर

7

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

थ्रेड आमतौर पर कुछ बनाने के लिए समय लेते हैं और उस बिंदु तक पहुंच जाते हैं जहां वे आपका कोड चला सकते हैं।

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

का उपयोग करके थ्रेड पूल का उपयोग कर कारणों में से एक कारण है: उनके काम पूरा होने के बाद थ्रेड समाप्त नहीं होते हैं। इसके बजाए, वे पुन: उपयोग करने के लिए चारों ओर लटकाते हैं ताकि स्टार्ट-अप समय फिर से नहीं किया जा सके।

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

इसके विपरीत, लघु चलने वाले धागे वे हैं जिनके रन टाइम स्टार्ट-अप समय से कम या तुलनीय हैं।


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

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

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

+0

और मुझे लगा कोई सूत्र वहाँ थे ... http: //blog.stephencleary.com/2013/11/there-is-no-thread.html – Mick

+1

मिक, यह लिंक एसिंक I/O संचालन के बारे में बात करता है, वहां मौजूद कई थ्रेड हैं जो _other_ चीजें करते हैं, जैसे चीजें जो आप कर सकते हैं जब आप कार्य फैक्ट्री को कॉल करते हैं तो करना चाहते हैं :-) – paxdiablo

+0

मैंने बहुत सारे बहु थ्रेडेड प्रोग्रामिंग किए हैं लेकिन टीपीएल के साथ नहीं। तो एसिंक I/O ऑपरेशन से एसिंक ऑपरेशन को क्या अलग करता है? – Mick

-2

"टास्क क्रिएशनऑप्शन। लोंगरिंगिंग यह निर्दिष्ट करता है कि एक कार्य लंबे समय से चलने वाले, मोटे अनाज वाले ऑपरेशन होंगे जो जुर्माना वाले सिस्टम की तुलना में कम, बड़े घटक शामिल होंगे। यह टास्कशेड्यूलर को संकेत देता है कि ओवरस्क्रिप्शन की आवश्यकता हो सकती है। ओवरस्क्रिप्शन आपको देता है हार्डवेयर धागे की उपलब्ध संख्या से अधिक धागे बनाएँ।।।। "- MSDN http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskcreationoptions(v=vs.110).aspx

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