2012-11-15 32 views
19

मेरे पास एक कंसोल एप्लिकेशन है जो मैं अभी भी घटनाओं में सुनते समय हर समय खुला रखना चाहता हूं। मैंने Thread.Sleep(Timeout.Infinite); और while (true) { } का परीक्षण किया है और दोनों कंसोल एप्लिकेशन को खोलते समय ईवेंट को उठाए जाने की अनुमति देते हैं। क्या कोई ऐसा है जिसे मुझे दूसरे पर इस्तेमाल करना चाहिए? अगर धागा सो रहा है, तो क्या ऐसा कुछ भी है जो मुझे नहीं करना चाहिए, जैसे कक्षा के दायरे में घोषित एक स्थिर संग्रह को संशोधित करना?थ्रेड है। सो जाओ (टाइमआउट। अनंत); जबकि (सत्य) {} से अधिक कुशल

उत्तर

22

मैं एक ManualResetEvent (या अन्य WaitHandle) का उपयोग कर, और ManualResetEvent.WaitOne बुला की सिफारिश करेंगे।

यह सिवाय इसके कि यह आप अपने अनंत "ब्लॉक" से बाहर निकलने के के लिए एक साफ तरीका प्रदान करता है जब (घटना पर Set() फोन करके) वांछित, हमेशा के लिए सो लिए एक समान प्रभाव पड़ेगा।

while(true) का उपयोग CPU चक्रों का उपभोग करेगा, इसलिए यह निश्चित रूप से बचने के लिए कुछ है।

क्या ऐसा कुछ भी है जो मुझे नहीं करना चाहिए, जैसे कक्षा के दायरे में घोषित एक स्थिर संग्रह को संशोधित करना?

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

+0

मैं वास्तव में इसे बाहर निकलना नहीं चाहता हूं, लेकिन अगर आप ऐसे लोगों को देख रहे हैं जो बाहर निकलने का तरीका चाहते हैं तो मैं आपका जवाब स्वीकार करूंगा। – Lunyx

+0

@Daniel अपने प्रोग्राम को बंद करने के लिए एक साफ तरीका है * आखिरकार *, भले ही यह उस समय में किसी विशिष्ट बिंदु पर कुछ न हो;) ऐसा कहा जा रहा है कि मैं अभी भी इस दृष्टिकोण का उपयोग नींद पर करूँगा, व्यक्तिगत रूप से। –

+0

मैन्युअल रीसेट इवेंट का उपयोग करने का उपयोग थ्रेड के साथ भिन्न होगा। नींद() यदि प्रोग्राम बंद होने पर प्रोग्राम बंद होने पर एकमात्र समय होता है? – Lunyx

4

while(true)... के विपरीत, Thread.Sleep CPU चक्र का उपयोग नहीं करता है, इसलिए इस अर्थ में, नींद अधिक कुशल है। आम तौर पर के बाहर Busy Waiting का उपयोग करके दृढ़ता से निराश किया जाता है।

यदि धागा सो रहा है, तो क्या ऐसा कुछ भी है जो मुझे नहीं करना चाहिए?

चूंकि आपका धागा Thread.Sleep पर प्रवेश करने पर अवरुद्ध है, जो भी आप अपने संसाधनों के साथ करना चाहते हैं वह एक उचित गेम है। sleep() समारोह सोने के लिए वर्तमान निष्पादन संदर्भ रखता है;:

+0

धन्यवाद, मैं जबकि पाश मैं क्या कर रहा हूं पूरा करने के लिए कोशिश कर रहा है लोगों के लिए सिफारिश की जा रही देखा है और मुझे यकीन है कि अगर इसके बारे में जाने के लिए सही तरीका था नहीं था। – Lunyx

2

हाँ, while(true) एक समझदारी भरा तरीका में sleep() काम करता है, जबकि सीपीयू की खपत यह एक syscall बुला गिरी नींद समारोह जो atomically
(क) एक वेकअप टाइमर सेट आह्वान करने के लिए ऐसा करता है
(ख) सो
(ग) के रूप में वर्तमान प्रक्रिया के निशान Wakeup टाइमर आग या जब तक इंतजार कर रहा है एक बाधा

यदि आप sleep() पर कॉल करते हैं, तो CPU अन्य कार्य कर सकता है।

यही कारण है कि sleep() उपयोगी है।

एक उपयोगी लिंक - Be careful when using Sleep

3

मैं कॉल

while (true) { ... } 

कंप्यूटेशनल रूप से संवेदनशील है, क्योंकि धागा कभी नहीं बंद हो जाता है, wheareas

Thread.Sleep(Timeout.Infinite); 

वास्तव में ओएस देशी शेड्यूलर की मदद से सोने के लिए धागा हो जाता है लगता है। और फिर धागा वास्तव में बंद हो जाता है, इसलिए मुझे लगता है कि यह कम कम्प्यूटेशनल रूप से मांग कर रहा है।

+2

आपके उत्तर में अनिश्चितता प्रतीत होती है ... "मुझे लगता है", "मुझे लगता है", आदि –

+0

मुझे जवाब के बारे में निश्चित था, लेकिन मैंने जावा में एक करियर शुरू किया इसलिए मैंने "मुझे लगता है" का उपयोग किया, "मुझे लगता है "सावधानी के लिए। :) – leoismyname

0

Thread.Sleep विधि कॉलिंग वर्तमान धागा तुरंत मिलीसेकेंड की संख्या या समय अंतराल आप विधि को पारित करने के लिए ब्लॉक करने के लिए कारण बनता है, और एक अन्य धागा करने के लिए अपने समय टुकड़ा के शेष अर्जित करता है।

https://msdn.microsoft.com/en-us/library/tttdef8x(v=vs.110).aspx

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

  • कोई संबंधित समस्या नहीं^_^