2009-02-03 33 views
20

का उपयोग करना उचित कब है, मैंने इसे अभी पढ़ा है: What is the benefit of developing the application as a windows service? लेकिन मुझे अभी भी विंडोज़ सेवा का उपयोग करने के बारे में अनिश्चितता है।अनुसूचित कंसोल ऐप बनाम विंडोज सेवा? प्रत्येक

मेरे पास कुछ कार्य हैं जिन्हें अंतराल पर चलाने की आवश्यकता है (यानी हर 5 मिनट)। मुझे किस परियोजना प्रकार का उपयोग करना चाहिए? क्या अनुप्रयोगों के प्रकारों के कोई उदाहरण हैं जो विंडोज सेवाएं होनी चाहिए?

+0

आप सेवा मार्ग जाते हैं, टाइमर का उपयोग नहीं है। यह क्रैश और गैर-ऑपरेटिंग स्थिति में आपकी सेवा छोड़ सकता है, लेकिन ऐसा लगता है कि यह चल रहा है। – StingyJack

+1

मुझे यह भी नहीं पता कि टाइमर के लिए "क्रैश" का क्या अर्थ है। टाइमर ओएस का हिस्सा हैं, और यदि आपकी दुर्घटनाग्रस्त हो जाती है तो आपकी सेवा में टाइमर की तुलना में बड़ी समस्याएं होती हैं। – MSalters

+0

टाइमर ओएस का हिस्सा नहीं हैं। अधिक जानकारी के लिए यह एसओ पोस्ट देखें। http://stackoverflow.com/questions/397744/-net-windows-service-with-timer-stops-responding/397757#397757 – StingyJack

उत्तर

24

किसी भी निर्धारित कार्य, मैं आमतौर पर, एक Windows सेवा की सिफारिश करेंगे निम्नलिखित कारणों के लिए के लिए:

  • एक Windows सेवा भले ही एक उपयोगकर्ता पीसी में प्रवेश न होने पर चलेंगे (यहां तक ​​कि सर्वर यदि चलेंगे लॉगिन प्रॉम्प्ट पर बैठा है) (*** नोट - यह आपके द्वारा चलाए जा रहे विंडोज़ संस्करण पर निर्भर हो सकता है)।
  • एक सेवा इस तरह के नेटवर्क सेवा या स्थानीय सिस्टम, या एक उपयोगकर्ता के रूप में के रूप में उच्च अधिकार खातों चला सकते हैं - वे इस संबंध में अधिक configurability है
  • एक सेवा भी शुरू कर रोक, को पुन: प्रारंभ करने के लिए विकल्पों के साथ में बनाया आता है, और जबकि (कभी कभी)
  • तुम भी सेवाओं के लिए विफलता की स्थिति सेट कर सकते हैं चल रहा रोक, अगर है जैसे कि यह विफल रहता है यह स्वत: पुनः आरंभ

जहाँ तक अनुप्रयोगों के अन्य उदाहरण खिड़कियों सेवाओं हो सकता है कि, का एक बहुत कुछ के रूप में है कई बार वे रीमोटिंग जैसे अनुप्रयोगों के लिए उपयोगी होते हैं - आप एक सेवा को एक रिमोटिंग सर्वर चला सकते हैं जो क्लाइंट कनेक्ट हो। डेटा प्रोसेसिंग कार्यों के लिए स्पष्ट रूप से बहुत उपयोगी है, जिन्हें आप पृष्ठभूमि में भी चलाने के लिए चाहते हैं, या प्रक्रियाओं को जहां आप कुछ शर्तों पर ईमेल भेजना चाहते हैं, आदि।

सामान्य रूप से मैंने हमेशा निर्धारित कार्य पाया है नाजुक और अविश्वसनीय। और जब तक कि आप उन्हें ठीक से लॉग इन नहीं करते हैं, अक्सर डीबग करना कठिन होता है।

टाइमर के साथ बग के संदर्भ में - यदि आप एमएस की साइट पर बग रिपोर्ट पढ़ते हैं, तो आप देख सकते हैं कि जब आप Timer_Elapsed ईवेंट के अंदर "रोकें" कहते हैं तो ऐसा होता है। इसका उत्तर सरल है - स्टॉप कॉल न करें। इसके बजाय, पूरी चीज़ को "IsRunning" बूलियन के लिए चेक में लपेटें और केवल तभी चलें जब IsRunning गलत है। यहां तक ​​कि यदि टाइमर के साथ कोई समस्या नहीं थी, तो आपको वैसे भी ऐसा करने की ज़रूरत है क्योंकि आपके निष्पादन के दौरान टाइमर आपके आग लगने के दौरान फिर से आग लग सकता है यदि आपका निष्पादन आपके टाइमर अंतराल से अधिक समय लेता है।

वैसे भी, मुझे अभी भी लगता अनुसूचित कार्यों का उपयोग कर एक कमजोर समाधान है और मुझे Windows 95 के फ्लैशबैक

+7

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

+1

मुझे यकीन है कि जहां लोगों को यह विचार है कि कार्य शेड्यूलर सेवा किसी भी तरह अविश्वसनीय है, यह शायद विंडोज 98 में सच था मिल गया है नहीं कर रहा हूँ लेकिन निश्चित रूप से पद Win2K इस स्पष्ट सच नहीं है। –

+0

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

1

यह विंडोज सेवा, आईएमओ के लिए एक आम मामला है।

0

मैं ज्यादातर मामलों में खिड़कियों सेवा पसंद करेंगे देता है।
अनुसूचित कार्यों का उपयोग करते समय एक अच्छी बात:
शेड्यूल किए गए कार्य समाप्त होने पर सभी प्रयुक्त संसाधन जारी किए जाते हैं।

विंडोज सेवा (सेवा को रोकने के बिना) का उपयोग करते समय, प्रक्रिया कभी नहीं मरती। और आपको अपने कार्यक्रम में यह सुनिश्चित करना होगा कि संसाधन जारी किए जाएंगे।

+0

विंडोज़ सेवा को रोकते समय, संसाधन भी जारी किए जाते हैं। – StingyJack

+0

@StringyJack: हाँ, मैं सहमत हूं। जब आप सेवा को रोकते हैं। लेकिन अगर आप विंडोज़ सेवा को नहीं रोकते हैं ...;)) –

+0

अरे ... मेरा डेवलपर गट "स्ट्रिंगी" टिप्पणी पर नाराज है। =) – StingyJack

21

एकल या संकीर्ण उद्देश्य अनुप्रयोगों एक समय पर रन कार्य शेड्यूलर के माध्यम से एक सांत्वना अनुप्रयोग चल के लिए लगभग हमेशा सही डिजाइन है।

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

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

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

संपादित करें: यह भी दिलचस्प है कि माइक्रोसॉफ्ट नीति कार्य आधारित कार्यों के लिए सेवाओं का उपयोग करने से दूर हो रही है। यदि आप Vista, Win2K8 और Win7 की जांच करते हैं तो आपको विशेष उद्देश्य निर्धारित कार्यों की बढ़ती सूची दिखाई देगी जो सिस्टम रखरखाव और कई सिस्टम सेवाओं को निष्पादित करती हैं।

1

मेरे पास कई विंडोज़ नियत कार्य हैं जो उत्पादन वेब सर्वर पर प्रति घंटा चलते हैं। वे बिल्कुल भरोसेमंद नहीं हैं। वे एक विशिष्ट मशीन खाते के तहत विंडोज 2003 सर्वर में चल रहे हैं। अधिकांश समय वे पूरी तरह से काम करते हैं, लेकिन कभी-कभी वे दौड़ने में असफल होते हैं और कभी-कभी वे समाप्त होने से पहले समाप्त हो जाते हैं।

इनमें से कुछ इस तथ्य के कारण हो सकते हैं कि वे vbscripts हैं और जिस तरह से वे लिखे गए हैं, लेकिन मैंने डब्ल्यूएस एफ़टीपी प्रो (वाणिज्यिक एफ़टीपी सॉफ्टवेयर) के साथ निर्धारित कार्यों को देखा है जो वही व्यवहार करते हैं।

मैंने इनमें से कई को विंडोज सेवाओं में परिवर्तित कर दिया है और उन्हें फिर से उनके बारे में चिंता करने की ज़रूरत नहीं है।

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

1

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

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

2

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

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

कार्य शेड्यूलर कार्य किसी भी उपयोगकर्ता संदर्भ के तहत चलाया जा सकता है और किसी को लॉग इन करने की आवश्यकता नहीं है।

मेरे सबसे बड़ी प्लस तैनाती में है। कंसोल ऐप्स के लिए, बस EXE को सही लक्ष्य फ़ोल्डर में प्रकाशित करें। खिड़कियों सेवाओं के लिए आप सेवा बंद करने के लिए (net.exe का प्रयोग करके) की जरूरत है सेवा (InstallUtil.exe का प्रयोग करके) (मैं 25 सेकंड तक तैनाती नींद),, रुको EXE प्रकाशित और फिर रिवर्स में यह सब करने की स्थापना रद्द (स्थापित , प्रारंभ)।

अगर मैं एक खिड़कियों सेवा विकसित करने के लिए थे फिर मैं एक सांत्वना अनुप्रयोग के रूप में यह लिखते थे और फिर एक सेवा में रैप करने के लिए सिर में दर्द की कम डिबगिंग बनाने के लिए एक रास्ता खोजने।

+0

विजुअल स्टूडियो एक्सप्रेस का उपयोग कर डेवलपर्स के लिए अतिरिक्त विचार है! – David

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