2009-06-15 25 views
12

में थ्रेड स्लीप() का उपयोग करना मैं एक विंडोज़ सेवा लिख ​​रहा हूं जिसे लंबे समय तक सोने की जरूरत है (15 घंटे सबसे लंबे समय तक सो जाएगा, 30 मिनट सबसे छोटा है)। मैं वर्तमान में थ्रेड का उपयोग कर रहा हूं। नींद (गणना समय) मेरा कोड नींद मोड में डालने के लिए। थ्रेड है। सबसे अच्छा विकल्प सो जाओ या क्या मुझे टाइमर का उपयोग करना चाहिए? मैं थोड़ी देर के लिए यह गुगल रहा हूं और संक्षिप्त जवाब नहीं मिला। चूंकि यह एक विंडोज़ सेवा है, इसलिए मुझे यूआई लॉक करने की चिंता करने की ज़रूरत नहीं है, इसलिए मैं थ्रेड का उपयोग न करने का एक कारण नहीं सोच सकता। सो जाओ।विंडोज सेवा

किसी भी अंतर्दृष्टि की सराहना की जाएगी।

उत्तर

19

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

यदि अंतराल व्यापक रूप से फैलता है, और नियमित रूप से, तो आप इसे भी शेड्यूल कर सकते हैं। लेकिन यदि आप लंबे, निरंतर अंतराल के बारे में बात कर रहे हैं, तो हाँ एक टाइमर बेहतर होगा।

7

यह आम तौर पर खराब व्यवहार का मामलों का एक बहुत में Thread.Sleep() उपयोग करने के लिए के रूप में माना जाता है।

यदि आप पृष्ठभूमि में सेवा चलाने के लिए चाहते हैं, तो आपको टाइमर का उपयोग करना चाहिए।

सेवा केवल अनुसूचित अंतराल पर चलाने के होने की जरूरत है, तो मैं आपको Windows कार्य शेड्यूलर को जब आप इसे करने की जरूरत है विंडोज़ अनुप्रयोग को चलाने के लिए अनुमति देने के लिए इस पर गौर सलाह देते हैं।

5

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

1

एक और बात पर विचार करना है कि धागे परिमित संसाधन हैं और प्रत्येक थ्रेड अपने ढेर के लिए स्मृति के एक हिस्से (1MB?) खपत करता है। वे शेड्यूलर के लिए भी भार बढ़ा सकते हैं।

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

9

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

आपकी सेवा वर्ग के OnStop या OnShutdown तरीकों कहा जाता है, घटना की स्थापना की और है कि WaitOne सच वापस जाने के लिए कारण होगा और आप तो अपने कार्यकर्ता धागा बाहर निकल सकते हैं।