13

मैंने दूसरे दिन पढ़ा है कि लंबे समय तक चलने वाले कार्यों के लिए मेरी सबसे अच्छी शर्त मैन्युअल रूप से .NET के थ्रेड पूल या कार्य समानांतर का उपयोग करने के बजाय धागे बनाना है। मैं वास्तव में किसी को मुझे प्रबुद्ध करने के लिए पसंद करूंगा क्योंकि मैं सी # थ्रेडिंग के बारे में सीख रहा हूं, खासकर लंबे समय तक चलने वाले आईओ कार्यों के लिए। पहले ही, आपका बहुत धन्यवाद।क्या यह सच है कि लंबे समय तक चलने वाली प्रक्रियाओं के लिए थ्रेडपूल के बजाय मैन्युअल रूप से थ्रेड करना बेहतर होता है?

+1

इस प्रश्न की समीक्षा करें: http://stackoverflow.com/questions/230003/thread-vs-threadpool –

उत्तर

7

आप सही हैं, थ्रेडपूल थ्रेड हल्का और सस्ता है क्योंकि थ्रेडपूल से एक नया अनुरोध करने के लिए पुन: निर्धारित किया जा सकता है, इसलिए जैसे ही थ्रेड ऑपरेशन किया जाता है, थ्रेडपूल अन्य ऑपरेशन के लिए उसी धागे को फिर से निर्धारित कर सकता है, आप भी कुशलतापूर्वक उपयोग कर सकते हैं न्यूनतम धागे गिनती (ThreadPool.SetMinThreads()) द्वारा, इसलिए नए अनुरोध आने तक वे जीवित रहेंगे। तो यह कई हल्के संचालन के लिए एक अच्छा समाधान है, उदाहरण के लिए आपको प्रत्येक कुछ सेकंड में एक अलग/नया धागा बनाना होगा।

MSDN पत्रिका पर बहुत अच्छा लेख: Dedicated thread or a Threadpool thread?

एक बार धागे की न्यूनतम संख्या तक पहुँच जाता है, थ्रेड पूल सीमा धागे की संख्या 500 मिलीसेकेंड प्रति एक करने के लिए बनाया जा रहा है करना है। यह एक बुद्धिमान तंत्र है, की महंगी लागत से बचने पर एक नया धागा बनाते हैं जब कई थ्रेड पूल थ्रेड उस समय अवधि के भीतर जारी किए जा सकते हैं।

चूंकि .NET 4.0 - कार्य समांतर लाइब्रेरी मैनुअल थ्रेड प्रबंधन और सिंक्रनाइज़ेशन के लिए एक अच्छा उच्च स्तरीय अमूर्त और विकल्प है, इसलिए आपका कोड कम त्रुटि प्रवण होगा। तो TaskCreationOptions.LongRunning के साथ, मुझे विश्वास है कि यह रखरखाव दृष्टिकोण से एक अनुप्रयोग वास्तुकला में सबसे अच्छा निवेश होगा।

उपयोगी पढ़ने:

+0

आपके दिशानिर्देशों के लिए बहुत बहुत धन्यवाद। – user1193665

14

यही सच है। थ्रेड पूल को काम की छोटी इकाइयों के लिए अनुकूलित किया गया है और आप थ्रेड पूल थ्रेड पर रखकर अन्य काम में हस्तक्षेप कर सकते हैं।

अंगूठे का मेरा नियम यह है कि यदि कोई ऑपरेशन एक सेकंड से अधिक समय ले सकता है, तो यह थ्रेड पूल थ्रेड पर नहीं होना चाहिए। यह शायद काफी लंबा है।

हालांकि यह अनियंत्रित है, यदि आप TaskTaskCreationOptions.LongRunning के साथ प्रारंभ करते हैं तो कार्य को चलाने के लिए एक नया थ्रेड शुरू किया जाएगा।

अधिकांश आईओ कार्यों के लिए, फ्रेमवर्क विधियों के असीमित संस्करण हैं जिनका आपको वास्तव में उपयोग करना चाहिए। ये कर्नेल कार्यों का उपयोग करते हैं और इसका मतलब है कि आप किसी भी धागे को अवरुद्ध नहीं करेंगे।

हमेशा की तरह, मैं Joe Albahari's free ebook, पढ़ने के बाद Joe Duffy's Concurrent Programming on Windows पढ़ने की अनुशंसा करता हूं। बाद में 1000 पेज लंबा है, लेकिन उपयोगी विवरण से भरा है।

+0

मैं जिस मानदंड का उपयोग करूंगा, वह यह होगा कि थ्रेड से कुछ होने के लिए "प्रतीक्षा" करने का कोई महत्वपूर्ण समय बिताने की उम्मीद है या कुछ विशेष कार्यवाही करता है जिसके लिए कोई अन्य थ्रेड इंतजार कर रहा है। – supercat

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

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