2012-02-23 10 views
16

मैं प्रसंस्करण में देरी बनाने या कुछ समान बनाने के लिए लोगों को हमेशा Thread.Sleep() का उपयोग करके लोगों को देखता हूं और लोग हमेशा इस तरह इसका उपयोग करने के लिए व्यर्थ होते हैं।थ्रेड का उपयोग करने के लिए समझदारी कब होती है। नींद()?

Thread.Sleep() का उपयोग करने के लिए समझदार/आवश्यक कब है?

+0

लोगों ने इस सवाल को बिना किसी स्पष्टीकरण के क्यों वोट दिया है? – ediblecode

+0

-1 कृपया एक भाषा चुनें। इस प्रश्न का उत्तर अन्य पुस्तकालयों का संदर्भ देगा। यह प्रश्न एक ही समय में दो अलग-अलग भाषाओं के बारे में पूछने में भ्रमित है। –

+1

@ErickRobertson तो क्या आप कह रहे हैं कि दो प्रश्न बनाए जाने चाहिए? मेरे लिए थोड़ा अपरिहार्य लगता है। – ediblecode

उत्तर

22

आपको Thread.sleep() पर कॉल करना चाहिए जब आपको वास्तव में पृष्ठभूमि थ्रेड में देरी की आवश्यकता होती है।

सिंक्रनाइज़ेशन (यह नहीं होगा) में मदद करने के लिए इसे कॉल न करें, इसे किसी लूप में कॉल करने के लिए कॉल न करें (यह धीमा हो जाएगा) और इसे कभी भी UI थ्रेड पर कॉल न करें (यह स्थिर हो जाएगा)।

+10

बस जोड़ने के लिए: और थ्रेड के साथ एक सटीक टाइमर बनाने का प्रयास न करें। सो जाओ। –

+0

मैं फ़ाइलों के एक सेट या नेटवर्क सॉकेट पर लंबी प्रोसेसिंग करते समय पृष्ठभूमि धागे पर 'थ्रेड स्लीप' का उपयोग करता हूं (और थ्रेड पूरा होने पर कॉलबैक बनाते हैं)। क्या यह 'थ्रेड स्लीप' के लिए अच्छा उपयोग है या ऐसा करने के लिए एक बेहतर machanism है? – Matthew

+0

@ मैथ्यू लगता है जैसे आप एक धागे के काम के लायक करने के लिए दो धागे का उपयोग कर सकते हैं। क्या सोने का धागा समय-समय पर जागने से कुछ भी अलग करता है और यह देखने के लिए जांच करता है कि कोई कार्यकर्ता धागा अभी भी काम कर रहा है या नहीं? क्या कार्यकर्ता थ्रेड कॉलबैक स्वयं ही नहीं कर सकता है जब यह हो जाता है? वर्णन करने के लिए –

-2

यदि आप किसी थ्रेड को कुछ करना बंद करना चाहते हैं, तो जब आप अंतहीन पाश बनाते हैं, तो आप लूप को न रोकना चाहते हैं, क्योंकि यह बहुत सी CPU पावर भी लेगा, इसमें थ्रेड सो जाएगा। लूप को "ब्रेक लेना" देगा और सीपीयू को कुछ आराम दें ^^।

+0

यदि आप कभी ऐसा कुछ प्रोग्राम करने जा रहे थे, तो क्या आप टाइमर का उपयोग करें? – ediblecode

+1

नींद() कॉल को बदलने के लिए आप टाइमर का उपयोग कैसे करते हैं? मान लीजिए कि आप किसी तृतीय-पक्ष स्क्रिप्ट-दुभाषिया 'ऑनप्रोसेसलाइन' ईवेंट में हैं, अलग-अलग स्क्रिप्ट चलाने वाले कई धागे में से एक के ढेर पर अज्ञात गहराई , और आप 10ms के लिए रुकना चाहते हैं। आप टाइमर के साथ ऐसा कैसे करते हैं? –

0

इसका उपयोग एक संदर्भ स्विच (1 के पैरामीटर के साथ) को मजबूर करने के लिए या अन्य उच्च प्राथमिकता धागे (0 के एक पार्म के साथ) को उत्पन्न करने के लिए किया जा सकता है .... लेकिन इसकी शायद ही कभी आवश्यकता है।

5

जब आपको कुछ फेंकने या परीक्षण कोड में रोक लगाने की आवश्यकता होती है, तो थ्रेड। नींद() ठीक है।

उत्पादन कोड में, एक अलग विकल्प खोजने का प्रयास करना सबसे अच्छा है। उदाहरण के लिए, यदि आप अंतराल पर कुछ करने की कोशिश कर रहे हैं, तो कई पूर्व-मौजूदा टाइमर कक्षाओं में से एक का उपयोग करें। यदि आप इनपुट कतार खाली होने पर (और .NET पर) रुकने का प्रयास कर रहे हैं, तो इसके बजाय Monitor.Wait() और Monitor.Pulse() का उपयोग करने पर विचार करें।

अधिक (फिर से, नेट केंद्रित)() नींद की कमियां इस लेख में की व्याख्या: Thread.Sleep is a sign of a poorly designed program.

+1

+1 इसमें बहुत से गैर-उत्पादन कोड का उपयोग होता है। मल्टीथ्रेड किए गए ढांचे को विकसित/प्रदर्शित करते समय लंबे समय तक चलने वाले कार्यों को प्रदर्शित करना भी उपयोगी होता है। यह जानकर कि यह है वास्तविक काम के लिए बस एक स्टैंड। – Servy

+0

मैंने उस लिंक किए गए आलेख को पहले पढ़ा है। मैंने इसे फिर से पढ़ा है। यह बुरा था। यह दूसरी बार बदतर है। –

3

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

इसके अलावा, यदि आप परीक्षण के लिए देरी अनुकरण करना चाहते हैं। मान लें कि आप एक प्रगति पट्टी का परीक्षण करना चाहते थे।

3

बहुत कम स्थितियां हैं जहां मैं इसे स्वीकार्य मानता हूं। आखिरकार यह मेरे दिमाग में निम्नलिखित स्थितियों के लिए आता है- अन्य ऐसे मामलों में झुक सकते हैं जहां ये लागू नहीं होते हैं, लेकिन अंगूठे के नियम के रूप में निम्नलिखित में से सभी को थ्रेड का उपयोग करने के लिए मेरे लिए सच होना जरूरी है। उत्पादन में सो जाओ (उर्फ तुच्छ या परीक्षण नहीं) कोड:

  1. आप एक संसाधन पर इंतजार कर रहे हैं
  2. सवाल तत्परता (एक WaitHandle या कुछ और के समुचित सक्रिय सूचना प्रदान नहीं करता है)
  3. आप अन्यथा संसाधन संशोधित नहीं कर सकते में संसाधन ऐसा करने के लिए
  4. आपने माप लिया है और पता है कि आपको लंबे समय तक इंतजार करना होगा कि स्पिनवाइट उचित नहीं है, एक डी कि आप संदर्भ छोड़कर बेहतर प्रदर्शन मिलता है।
0

यदि आपको Thread.Sleep की आवश्यकता है तो आपके पास गलत डिज़ाइन हो सकता है। बेहतर उपयोग सिंक्रनाइज़ेशन तंत्र जैसे AutoResetEvent या ManualResetEvent और घटनाओं के होने का इंतजार करें। मैंने अक्सर Thread.Sleep के साथ मतदान मतदान देखा है, लेकिन यदि संभव हो तो ईवेंट का उपयोग करने का प्रयास करना बेहतर होगा।

+1

यह उत्तर ऑफ़र प्रश्न का कोई उत्तर नहीं। – ediblecode

+0

मैं आपको बताना चाहता हूं कि आपको कभी भी थ्रेड का उपयोग नहीं करना चाहिए। नींद और बेहतर घटना तंत्र का उपयोग करें। आपके प्रश्न का मेरा जवाब है, शायद यह स्पष्ट नहीं था। – BlueM

+0

और जैसा कि ऊपर दिए गए उत्तर में उल्लिखित है http://msmvps.com/blogs/peterritchie/archive/2007/04/26/thread-sleep-is-a-ign-of-a-poorly-designed-program.aspx यह वास्तव में खराब डिजाइन का संकेत है। ".NET में इसका उपयोग करने का कोई अन्य कारण नहीं है।" – BlueM

0

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

यदि आप निश्चित समय के लिए अपने प्रसंस्करण कोड में देरी करना चाहते हैं, तो नींद() एक अच्छी बात है (हालांकि, Timer कक्षा आवधिक व्यवहार को लागू करने का एक अच्छा तरीका है)।

+0

टाइमर प्रक्रियात्मक चश्मे को लागू करने के लिए डेवलपर्स को राज्य-मशीन विकसित करने के लिए मजबूर करता है। यदि एक ऑपरेशन को सरल चरणों के अनुक्रमों द्वारा परिभाषित किया जाता है, जो अक्सर लंबे अंतराल से अलग होते हैं, फ़ंक्शन कॉल और नींद() सीधे इस पर मानचित्र को कॉल करते हैं। एक असीमित राज्य-मशीन नहीं है। –

+0

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

-1

जब भी आपको अपने परिचालनों में लंबे समय तक रोक की आवश्यकता होती है तो इसका इस्तेमाल करें। यदि कल्पना कहती है 'अब जारी रखने से कम से कम 10 सेकंड पहले प्रतीक्षा करें', तो नींद (10000) पर कॉल करें। एक विकल्प है - आप अपने कोड को राज्य-इंजन के रूप में फिर से लिख सकते हैं ताकि जब तक टाइमर ईवेंट नहीं निकाल दिया जाता है तब तक नियंत्रण को आत्मसमर्पण किया जा सकता है। एक टेबल संचालित राज्य मशीन बहुत लचीला है और पूरी तरह से asychronous ऑपरेशन की अनुमति देता है। परिणामस्वरूप 'कोड' शायद किसी भी तरह की आवश्यकता के समान नहीं होगा, यह समझने में लगभग असंभव होगा कि क्या हो रहा है, डीबग करना मुश्किल है और संशोधित करने, बनाए रखने और/या बढ़ाने के लिए एक दुःस्वप्न है, लेकिन आप उस बुराई से बचने में सक्षम होंगे , एंटी-पैटर्न 'स्लीप (10000)' कॉल।

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

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