एक लंबा चलने वाला कार्य वह है जो प्रतीक्षा स्थिति में प्रवेश कर सकता है, जिस धागे पर चल रहा है उसे अवरुद्ध कर सकता है, या जो बहुत अधिक CPU समय लेता है (हम इस पर वापस आ जाएंगे)।
कुछ लोग कह सकते हैं कि यह परिभाषा बहुत व्यापक है, कई कार्य लंबे समय तक चलेंगे, लेकिन इसके बारे में सोचें, भले ही प्रतीक्षा एक छोटे से समय सीमा तक सीमित हो, फिर भी कार्य CPU को प्रभावी ढंग से उपयोग नहीं कर रहा है। यदि इन कार्यों की मात्रा बढ़ जाती है, तो आप देखेंगे कि वे MinWorkerThreads (ThreadPool.SetMinThreads
देखें) के पीछे रैखिक रूप से स्केल नहीं करते हैं, अवक्रमण वास्तव में खराब है।
सभी आई/ओ (फ़ाइल, नेटवर्क, डीबी, आदि) को एसिंक्रोनस के रूप में स्विच करने का दृष्टिकोण।
लंबे CPU-गहन कंप्यूटेशंस के कारण लंबे समय तक चलने वाले कार्य भी हैं।
दृष्टिकोण कुछ बिंदुओं पर await Task.Yield()
डालने जैसे गणना को रोकना है, या दूसरे के बाद एक कार्य को शेड्यूल करके स्पष्ट रूप से गणना करना, प्रत्येक डेटा के पहले विभाजित हिस्से को संसाधित करना या एक बफर को सीमाबद्ध सीमा तक संसाधित करना है ।
निर्णय लेने के लिए "बहुत अधिक समय" आपके ऊपर है।
जब आप ऐसे वातावरण में हों जहां आप थ्रेड पूल साझा कर रहे हों, तो किसी भी समय बहुत अधिक समय होता है, आपको एक समझदार मूल्य चुनना होगा।
उदा। आईआईएस के तहत एएसपी.नेट में, देखें कि सबसे आम अनुरोधों के लिए प्रति अनुरोध औसत समय क्या है। इसी तरह, एक सेवा में जहां थ्रेड पूल का उपयोग किया जाता है उदा। एक संदेश कतार संसाधित करने के लिए, औसत प्रति संदेश ले लो।
अधिक आम तौर पर, "बहुत अधिक समय" तब होता है जब कार्य आइटम संसाधित होने से तेज़ी से कतारबद्ध होते हैं। काम के विस्फोट हो सकते हैं, इसलिए आपको उस समय इकाई पर औसत देना चाहिए जो आपके लिए मायने रखता है, चाहे वह दूसरा हो, एक मिनट, 10 मिनट, आदि। जब आपके पास एसएलए हो, तो आपको यह अंतराल कहीं परिभाषित होना चाहिए।
एक समझदार मूल्य होने के बाद, आपको यह देखना चाहिए कि, यदि यह बढ़ाना ठीक है या आपको इसे कम करना है तो आपको देखना चाहिए। अधिकतर, यदि आप इसे बढ़ा सकते हैं, तो आप से बेहतर नहीं हैं, जब तक कि आप एक महत्वपूर्ण प्रदर्शन अंतर नहीं देख सकें। "महत्वपूर्ण" का अर्थ है संसाधित वस्तुओं की संख्या रैखिक रूप से अधिक बढ़ती है, इसलिए यदि यह रैखिक (या नीचे रैखिक, यह हो सकता है), तो ऐसा न करें।
मेरे अनुभव में, यदि आप इन परिभाषाओं में से किसी के द्वारा एक लंबी चलने वाली कार्य है, तो आप आमतौर पर अपने स्वयं के धागे के प्रबंधन या धागे के सेट के साथ बेहतर कर रहे हैं।
ठीक है, यह 'ThreadPool.QueueUserWorkItem' और' नया थ्रेड 'के बीच चयन करने की आवश्यकता होने पर पूर्व' कार्य 'दुनिया जैसा ही है। –
जानें [यह] (http://stackoverflow.com/a/13570611/1997232), [यह] (http://stackoverflow.com/a/13429164/1997232), [यह] (http: // stackoverflow। कॉम/q/7915947/+१९९७२३२)। अंगूठे के नियम के रूप में - 'LongRunning' का उपयोग न करें, जब तक कि यह वास्तव में लंबे समय तक चल रहा न हो (या तो आवेदन के समय के समान ही, उस के करीब या अपेक्षाकृत लंबी कार्य नौकरी पूरी होनी चाहिए)। – Sinatr
कोई विशिष्ट मूल्य नहीं है। इस धागे को देखें: https://social.msdn.microsoft.com/Forums/en-US/8304b44f-0480-488c-93a4-ec419327183b/when-should-a-taks-be-cononsidered-longrunning?forum=parallelextensions – Dennis