2010-04-07 7 views
6

चलाएगी, मैं एक विंडोज सेवा बनाने और इसे स्थापित करने में सक्षम हूं।विंडोज सेवा जो हर घंटे

मैं उत्सुक हूं कि मैं हर घंटे इस सेवा को कैसे चला सकता हूं? मैं इसे हर घंटे समय-समय पर चलाने के लिए चाहता हूं।

मुझे यह भी पता होना चाहिए कि यह कितनी घंटे चल रही है ताकि मैं इसे कहीं स्टोर कर सकूं।

मैं यह कैसे कर सकता हूं?

संपादित करें: यह सेवा कई मशीनों पर स्थापित की जाएगी, इसलिए, मैं 100 सर्वरों पर एक निर्धारित कार्य नहीं करना चाहता हूं।

उत्तर

12

आप लगातार करने के लिए विरोध के रूप में एक काम के लिए एक नियमित अंतराल पर चलाना चाहते हैं, तो आप Task Scheduler का उपयोग कर इस पर गौर करना चाहिए।

यदि आपको सेवा होने के लिए अपने कोड की आवश्यकता है, लेकिन हर घंटे "सक्रिय" होने के लिए, सबसे आसान तरीका आपकी सेवा को COM ऑब्जेक्ट बनाना होगा और प्रत्येक घंटे निर्धारित एक साधारण कार्य होगा जो एक jscript/vbscript को आमंत्रित करता है आपकी COM ऑब्जेक्ट बनाता है और उस पर सरल विधि कहता है।

विकल्प किसी भी प्रतीक्षा एपीआई का उपयोग चक्रों के बिना एक घंटे "अपशिष्ट" करने के लिए करना है।

ध्यान दें कि आप भी कुछ दिलचस्प डिजाइन फैसले कि क्या अपने परिदृश्य पर निर्भर करते हैं पर विचार करने के है:

  • कैसे आपकी सेवा आरंभ होने के लिए अगर यह दुर्घटनाओं जा रहा है या उपयोगकर्ता द्वारा बंद कर दिया है?
  • यदि आप एक घंटे से अधिक समय बाद शुरू कर चुके हैं, तो क्या आपको फिर से चलना चाहिए या आपको सही घंटे के शेड्यूल पर जाने के लिए इंतजार करना होगा?
  • यदि आप सक्रिय नहीं थे, तो टाइमज़ोन या दिन-प्रकाश बचत समय बदल गया है, तो आप अंतिम "सक्रियण" समय का ट्रैक कैसे रखते हैं?
  • क्या आपकी सेवा कंप्यूटर को निष्क्रिय करने या लैपटॉप कवर बंद होने पर नींद/हाइबरनेट करने से रोकती है? यदि नहीं, तो क्या आपको अपने शेड्यूल पर काम करने के लिए कंप्यूटर पर घंटे जागने की ज़रूरत है?

उनमें से कुछ को कार्य शेड्यूलर का ख्याल रखा जाता है, इसलिए मैं दृढ़ता से उस मार्ग बनाम अनुशंसा करता हूं कि आपके कोड में एक घंटे का इंतजार हो।

+0

प्रतीक्षा करें एपीआई सीपीयू चक्र बर्बाद? क्या आप इसे विस्तार से बताएंगे? प्रतीक्षा करें सिस्टम द्वारा उठाए गए एक कार्यक्रम है, मुझे नहीं लगता कि यह किसी भी चीज़ के लिए मतदान कर रहा है। –

+0

मुझे यकीन नहीं है कि आपने मुझे सही ढंग से समझा है। मैं यह कहने की कोशिश कर रहा था कि प्रतीक्षा अवधि एपीआई को समय-समय पर समाप्त होने की प्रतीक्षा करते समय CPU चक्रों का उपयोग न करने के लिए अनुकूलित किया गया है। –

3

आप scheduled task बना सकते हैं जो हर घंटे चलता है, या तो सेवा चलाता है या "इसे उठाने" के लिए एक संदेश भेजता है। फिर, या तो नियत कार्य अनुरोध में वर्तमान समय में पास हो जाएं, या बस अपना प्रोग्राम जागने पर वर्तमान समय उठाएं।

Task Scheduler Managed Wrapper इसे प्रोग्रामेटिक रूप से सेट करने में आपकी सहायता कर सकता है; आप अन्य संसाधनों के लिए भी Google कर सकते हैं।

+0

लेकिन मैं कोड में इसे लागू करने में सक्षम होना चाहता हूं। कल्पना करें कि यह सेवा कई सर्वरों में स्थापित की जाएगी, मैं प्रत्येक सर्वर पर नहीं जाना चाहता हूं और एक निर्धारित कार्य बनाना चाहता हूं। – DarthVader

+1

@ user177883: आप प्रोग्रामेटिक रूप से सेवाओं को बना सकते हैं जैसे प्रोग्रामिंग रूप से निर्धारित कार्यक्रम बना सकते हैं। –

3

कुछ विकल्प हैं।

  1. आप एक घंटे तक सो सकते थे।
  2. आप एक अनुसूचित कार्य के लिए बेहतर हो सकते हैं, सेवा नहीं।
2
Thread.Sleep(1000*60*60); 
+2

क्या होता है यदि आप एक घंटे के लिए सोते समय सेवा को रोकने का प्रयास करते हैं? –

2
Thread.Sleep(TimeSpan.FromHours(1)); 

कोड अधिक पठनीय इस तरह

2

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

0

कार्य शेड्यूलर एक अच्छा विचार हो सकता है लेकिन सेवाओं को ऐसा करने के लिए डिज़ाइन किया गया है। सेवाएं आसानी से इंस्टॉल हो जाती हैं और चीजों को ठीक से लॉग करती हैं। आपको बस सेवा की शुरुआत में, एक सिस्टम टाइमर (System.Threading.Timer) इंस्टॉल करना है या एक और टाइमर भी स्थापित करना है।