जवाबों:
अपडेट करें:
मेरे मूल उत्तर के लगभग चार साल बाद और यह उत्तर बहुत पुराना है। चूंकि टॉपशेलफ विंडोज सेवाओं के साथ आया था इसलिए विकास आसान हो गया। अब आपको बस यह पता लगाने की जरूरत है कि विफलता का समर्थन कैसे किया जाए ...
मूल उत्तर:
मैं वास्तव में विंडोज शेड्यूलर का प्रशंसक नहीं हूं। उपयोगकर्ता के पासवर्ड को @moodforall के रूप में ऊपर दिया जाना चाहिए , जो किसी के उस उपयोगकर्ता के पासवर्ड को बदलने पर मज़ेदार हो।
विंडोज शेड्यूलर के साथ अन्य बड़ी झुंझलाहट यह है कि यह अंतःक्रियात्मक रूप से चलता है न कि एक पृष्ठभूमि प्रक्रिया के रूप में। जब RDP सत्र के दौरान हर 20 मिनट में 15 MS-DOS विंडो पॉप अप होती हैं, तो आप अपने आप को किक मारेंगे, जिसने उन्हें विंडोज सर्विसेज के रूप में स्थापित नहीं किया।
जो कुछ भी आप चुनते हैं, मैं निश्चित रूप से आपको सलाह देता हूं कि आप अपने प्रोसेसिंग कोड को कंसोल ऐप या विंडोज सर्विस से अलग घटक में अलग करें। फिर आपके पास विकल्प है, या तो कार्यकर्ता प्रक्रिया को कंसोल एप्लिकेशन से कॉल करें और इसे विंडोज शेड्यूलर में हुक करें, या विंडोज सर्विस का उपयोग करें।
आप पाएंगे कि विंडोज सेवा को शेड्यूल करना मजेदार नहीं है। एक काफी सामान्य परिदृश्य यह है कि आपके पास एक लंबी चलने वाली प्रक्रिया है जिसे आप समय-समय पर चलाना चाहते हैं। लेकिन, यदि आप एक कतार संसाधित कर रहे हैं, तो आप वास्तव में एक ही कार्यकर्ता के दो उदाहरणों को एक ही कतार में संसाधित नहीं करना चाहते हैं। तो आपको टाइमर को प्रबंधित करने की आवश्यकता है, यह सुनिश्चित करने के लिए कि यदि आपकी लंबी चलने वाली प्रक्रिया असाइन किए गए टाइमर अंतराल से अधिक समय तक चली है, तो यह तब तक किक नहीं करता है जब तक कि मौजूदा प्रक्रिया समाप्त नहीं हो जाती है।
आपके द्वारा यह सब लिखे जाने के बाद, आप सोचते हैं, मैंने थ्रेड का उपयोग क्यों नहीं किया? यह मुझे वर्तमान धागा को तब तक चलने देने देता है जब तक कि यह समाप्त नहीं हो जाता है और फिर अंतराल अंतराल में किक करता है, धागा सोने के लिए जाता है और आवश्यक समय के बाद फिर से बंद हो जाता है। साफ!
तब आप इंटरनेट पर सभी विशेषज्ञों को बहुत सारे विशेषज्ञों के साथ सलाह देते हुए बताते हैं कि यह वास्तव में खराब प्रोग्रामिंग अभ्यास कैसे है:
तो आप अपना सिर खुजलाएंगे और अपने आप को सोचेंगे, डब्ल्यूटीएफ, अनडू पेंडिंग चेकआउट -> हां, मुझे यकीन है -> आज के सभी कामों को पूर्ववत करें ... लानत है, धिक्कार है, लानत है ...।
हालाँकि, मुझे यह पैटर्न पसंद है, भले ही सभी को लगता है कि यह बकवास है:
एकल-थ्रेड दृष्टिकोण के लिए ऑनस्टार्ट विधि।
protected override void OnStart (string args) { // Create worker thread; this will invoke the WorkerFunction // when we start it. // Since we use a separate worker thread, the main service // thread will return quickly, telling Windows that service has started ThreadStart st = new ThreadStart(WorkerFunction); workerThread = new Thread(st); // set flag to indicate worker thread is active serviceStarted = true; // start the thread workerThread.Start(); }
कोड एक अलग थ्रेड को इंस्टेंट करता है और हमारे कार्यकर्ता फ़ंक्शन को इसमें संलग्न करता है। फिर यह थ्रेड शुरू करता है और ऑनस्टार्ट इवेंट को पूरा करने देता है, ताकि विंडोज को यह न लगे कि यह सर्विस लटका हुआ है।
एकल-थ्रेड दृष्टिकोण के लिए कार्यकर्ता विधि।
/// <summary> /// This function will do all the work /// Once it is done with its tasks, it will be suspended for some time; /// it will continue to repeat this until the service is stopped /// </summary> private void WorkerFunction() { // start an endless loop; loop will abort only when "serviceStarted" // flag = false while (serviceStarted) { // do something // exception handling omitted here for simplicity EventLog.WriteEntry("Service working", System.Diagnostics.EventLogEntryType.Information); // yield if (serviceStarted) { Thread.Sleep(new TimeSpan(0, interval, 0)); } } // time to end the thread Thread.CurrentThread.Abort(); }
एकल-थ्रेड दृष्टिकोण के लिए OnStop विधि।
protected override void OnStop() { // flag to tell the worker process to stop serviceStarted = false; // give it a little time to finish any pending work workerThread.Join(new TimeSpan(0,2,0)); }
स्रोत: http://tutorials.csharp-online.net/Creating_a_.NET_Windows_Service%E2%80%94Alternative_1%3a_Use_a_Separate_Thread (डेड लिंक)
मैं सालों से इस तरह की बहुत सारी विंडोज सर्विसेज चला रहा हूं और यह मेरे लिए काम करती है। मैंने अभी भी एक अनुशंसित पैटर्न नहीं देखा है जिस पर लोग सहमत हैं। बस वही करें जो आपके काम आए।
NT AUTHORITY\NetworkService
सीमित विशेषाधिकारों के साथ एक खाता है।
यहाँ कुछ गलत जानकारी। विंडोज़ शेड्यूलर बिना पॉपअप और बिना किसी पासवर्ड की आवश्यकता के बिना पृष्ठभूमि में कार्य चलाने में पूरी तरह सक्षम है। इसे NT AUTHORITY \ SYSTEM खाते के अंतर्गत चलाएँ। इस schtasks स्विच का उपयोग करें:
/ आरयू सिस्टम
लेकिन हां, नेटवर्क संसाधनों तक पहुंचने के लिए, सबसे अच्छा अभ्यास एक अलग नॉन-एक्सपायरिंग पासवर्ड पॉलिसी के साथ एक सेवा खाता है।
संपादित करें
अपने OS और कार्य की आवश्यकताओं के आधार पर, आप /ru
विकल्प के साथ स्थानीय प्रणाली की तुलना में कम विशेषाधिकार प्राप्त खातों का उपयोग करने में सक्षम हो सकते हैं ।
ठीक मैनुअल से ,
/RU username
A value that specifies the user context under which the task runs.
For the system account, valid values are "", "NT AUTHORITY\SYSTEM", or "SYSTEM".
For Task Scheduler 2.0 tasks, "NT AUTHORITY\LOCALSERVICE", and
"NT AUTHORITY\NETWORKSERVICE" are also valid values.
टास्क शेड्यूलर 2.0 विस्टा और सर्वर 2008 से उपलब्ध है।
XP और सर्वर 2003 में, system
एकमात्र विकल्प है।
Local Service
(उर्फ NT AUTHORITY\LocalService
) के बजाय LocalSystem
(उर्फ .\LocalSystem
)। पूर्व के पास सीमित अधिकार हैं, जबकि बाद वाला एक प्रशासक है
LocalService
और वी 2 विस्टा NetworkService
में उपलब्ध हैं schtasks
और जहां संभव हो, इसे प्राथमिकता दी जानी चाहिए। इस समय, इसे schtasks
XP और सर्वर 2003 में संदर्भित किया गया है , जो केवल System
पुराने संस्करण मैनुअल टेक्नेट के
ऐप को शुरू करने और छोड़ने का ओवरहेड क्या है? हर दो मिनट में अक्सर होता है। एक सेवा शायद आपके आवेदन को निष्पादित करने की तुलना में सिस्टम को अधिक सुचारू रूप से चलाने देगी।
जब उपयोगकर्ता लॉग इन नहीं होता है, तो दोनों समाधान कार्यक्रम को चला सकते हैं, इसलिए वहां कोई अंतर नहीं है। एक सेवा लिखना कुछ हद तक एक नियमित डेस्कटॉप ऐप की तुलना में शामिल है, हालांकि - आपको एक अलग GUI क्लाइंट की आवश्यकता हो सकती है जो TCP / IP, नामित पाइप, आदि के माध्यम से सेवा ऐप के साथ संवाद करेगा।
एक उपयोगकर्ता के पीओवी से, मुझे आश्चर्य है कि नियंत्रण करना आसान है। अधिकांश गैर-तकनीकी उपयोगकर्ताओं के लिए दोनों सेवाएँ और अनुसूचित कार्य बहुत अधिक नहीं हैं, अर्थात उन्हें एहसास भी नहीं होगा कि वे मौजूद हैं और उन्हें कॉन्फ़िगर / रोका / पुनर्निर्धारित और इसी तरह कॉन्फ़िगर किया जा सकता है।
.NET विकास में, मैं आमतौर पर एक कंसोल एप्लिकेशन विकसित करके शुरू करता हूं, जो कंसोल विंडो में सभी लॉगिंग आउटपुट को चलाएगा। हालाँकि, यह केवल कंसोल अनुप्रयोग है जब इसे कमांड तर्क के साथ चलाया जाता है /console
। जब यह इस पैरामीटर के बिना चलाया जाता है, तो यह विंडोज सेवा के रूप में कार्य करता है, जो मेरे स्वयं के कस्टम कोडित शेड्यूल किए गए टाइमर पर चलता रहेगा।
विंडोज सर्विसेज, आई माइ माइ, आमतौर पर लंबे समय तक चलने वाले एप्लिकेशन के बजाय अन्य एप्लिकेशन को प्रबंधित करने के लिए उपयोग की जाती हैं। OR .. वे SQL सर्वर, BizTalk, RPC Connections, IIS (भले ही IIS तकनीकी रूप से अन्य कार्यों के लिए काम करते हैं) जैसे हैवीवेट एप्लिकेशन को लगातार चला रहे हैं।
व्यक्तिगत रूप से, मैं दोहरावदार रखरखाव कार्यों और फ़ाइल कॉपी / सिंक्रोनाइजेशन, बल्क ईमेल भेजने, फ़ाइलों को हटाने या संग्रह करने, डेटा सुधार (जब अन्य वर्कअराउंड उपलब्ध नहीं हैं) जैसे अनुप्रयोगों के लिए विंडो सेवाओं पर अनुसूचित कार्यों का पक्ष लेता हूं।
एक परियोजना के लिए मैं 8 या 9 विंडोज सेवाओं के विकास में शामिल रहा हूं, लेकिन ये मेमोरी में बेकार बैठते हैं, उदाहरण के लिए 20MB या अधिक मेमोरी खा रहे हैं। शेड्यूल किए गए कार्य अपना व्यवसाय करेंगे, और मेमोरी को तुरंत जारी करेंगे।
शब्द 'serv'ice आम में' serv'er के साथ कुछ साझा करता है। यह हमेशा चल रहा है, और 'सर्व' होने की उम्मीद है। एक कार्य एक कार्य है।
रोल प्ले। यदि मैं एक और ऑपरेटिंग सिस्टम, एप्लिकेशन, या डिवाइस हूं और मैं किसी सेवा को कॉल करता हूं, तो मुझे उम्मीद है कि यह चालू होगा और मैं प्रतिक्रिया की उम्मीद करता हूं। अगर मुझे (ओएस, ऐप, देव) बस एक अलग कार्य को निष्पादित करने की आवश्यकता है, तो मैं एक कार्य को निष्पादित करूंगा, लेकिन अगर मैं संवाद करने की उम्मीद करता हूं, तो संभवतः दो तरह से संचार, मुझे एक सेवा चाहिए। यह संवाद करने के लिए दो चीजों के लिए सबसे प्रभावी तरीके से करना है, या एक ऐसी चीज जो किसी एक कार्य को निष्पादित करना चाहती है।
फिर शेड्यूलिंग पहलू है। यदि आप किसी विशिष्ट समय पर कुछ चलाना चाहते हैं, तो शेड्यूल करें। यदि आप नहीं जानते कि आपको कब इसकी ज़रूरत पड़ने वाली है, या इसे "मक्खी पर" सेवा की आवश्यकता है।
मेरी प्रतिक्रिया प्रकृति में अधिक दार्शनिक है क्योंकि यह बहुत ही समान है कि मनुष्य दूसरे के साथ कैसे बातचीत और काम करते हैं। जितना अधिक हम संचार की कला को समझते हैं, और "संस्थाएं" उनकी भूमिका को समझती हैं, यह निर्णय उतना ही आसान हो जाता है।
सभी दर्शन एक तरफ, जब आप "तेजी से प्रोटोटाइपिंग" कर रहे हैं, जैसा कि मेरा आईटी विभाग अक्सर करता है, तो आप कुछ भी करते हैं जो आपको पूरा करने के लिए होता है। एक बार अवधारणा सामान के प्रोटोटाइप और सबूत के बाहर होने के बाद, आमतौर पर शुरुआती योजना और खोज में, आपको यह तय करना होगा कि दीर्घकालिक स्थिरता के लिए अधिक विश्वसनीय क्या है।
ठीक है, इसलिए निष्कर्ष में, यह बहुत सारे कारकों पर निर्भर है, लेकिन उम्मीद है कि इसने भ्रम के बजाय अंतर्दृष्टि प्रदान की है।
Windows सेवा में किसी को भी लॉग इन करने की आवश्यकता नहीं होती है, और Windows में सेवा परिणामों को रोकने, शुरू करने और लॉग इन करने की सुविधा होती है।
एक निर्धारित कार्य के लिए आपको विंडोज सेवा लिखने का तरीका सीखने की आवश्यकता नहीं है।
NT AUTHORITY\LocalService
, या NT AUTHORITY\NetworkService
)। किसी भी दिए गए पासवर्ड को अनदेखा कर दिया जाता है क्योंकि खातों में कोई पासवर्ड नहीं होता है।
दोनों प्रदान क्यों नहीं करते?
अतीत में मैंने 'कोर' बिट्स को एक लाइब्रेरी में रखा है और जो भी एक सेवा के साथ-साथ एक कंसोल ऐप में जो भी है।
कुछ के साथ आप हर दो मिनट में फायर कर रहे हैं, यह सभ्य है कि यह बहुत कुछ नहीं कर रहा है (उदाहरण के लिए "पिंग" टाइप फंक्शन)। रैपर में एकल विधि कॉल और कुछ लॉगिंग से अधिक नहीं होना चाहिए।
यह एक पुराना सवाल है, लेकिन मैंने जो भी सामना किया है उसे साझा करना चाहूंगा।
हाल ही में मुझे एक रडार (एक मौसम विज्ञान वेबसाइट से) के स्क्रीनशॉट को कैप्चर करने और हर 10 मिनट में सर्वर में सहेजने की आवश्यकता बताई गई थी।
इसके लिए मुझे WebBrowser का उपयोग करना आवश्यक था। मैं आमतौर पर विंडोज़ सेवाएँ देता हूँ इसलिए मैंने यह एक सेवा भी बनाने का फैसला किया है लेकिन यह दुर्घटनाग्रस्त होती रहेगी। यह मैंने इवेंट व्यूअर में देखा फॉल्टिंग मॉड्यूल पथ : C: \ Windows \ system32 \ MSHTML.dll
चूंकि कार्य अत्यावश्यक था और मेरे पास अनुसंधान और प्रयोग के लिए बहुत कम समय था, मैंने एक साधारण कंसोल एप्लिकेशन का उपयोग करने का निर्णय लिया और इसे एक कार्य के रूप में शुरू किया और इसे आसानी से निष्पादित किया।
मैं वास्तव में जॉन गैलोवे के लेख को पसंद करता था, जिसे मार्क रैनसम ने स्वीकार किया था।
हाल ही में सर्वर पर पासवर्ड मुझे स्वीकार किए बिना बदल दिए गए थे और सभी सेवाएं निष्पादित करने में विफल रहीं क्योंकि वे लॉगऑन नहीं कर सकते थे। इसलिए लेख में ppl का दावा है कि यह एक समस्या है। मुझे लगता है कि विंडोज़ सेवाएं एक ही समस्या का सामना कर सकती हैं (Pls मुझे सही करें अगर मैं गलत हूं, तो मैं एक नौसिखिया हूं)
कार्य शेड्यूलर विंडो पॉप अप या कंसोल विंडो पॉप अप का उपयोग करते हुए भी, उल्लेखित बात। मैंने कभी उसका सामना नहीं किया। यह पॉप अप हो सकता है लेकिन यह कम से कम बहुत तात्कालिक है।
आम तौर पर, मुख्य संदेश यह है और यह होना चाहिए कि कोड को प्रत्येक "ट्रिगर / क्लाइंट" से निष्पादन योग्य होना चाहिए। इसलिए इसे एक से दूसरे दृष्टिकोण पर स्विच करने के लिए रॉकेट विज्ञान नहीं होना चाहिए।
अतीत में हम कम या ज्यादा हमेशा विंडोज सेवाओं का उपयोग करते थे लेकिन चूंकि हमारे अधिक से अधिक ग्राहक एज़्योर कदम से कदम मिलाते हैं और एज़्योर में वेबजॉब के लिए एक कंसोल ऐप (एक अनुसूचित कार्य के रूप में तैनात) से स्वैप बहुत आसान है। एक Windows सेवा, हम अभी के लिए अनुसूचित कार्य पर ध्यान केंद्रित करते हैं। यदि हम सीमाओं में चलते हैं, तो हम सिर्फ विंडोज सर्विस प्रोजेक्ट को पूरा करते हैं और वहां से उसी तर्क को कहते हैं (जब तक ग्राहक ऑनप्रेम काम कर रहे हैं ..) :)
बीआर, वाई
विंडोज सेवाएं तब तक अधिक धैर्य चाहती हैं जब तक कि यह पूरा न हो जाए। यह थोड़ा कठिन डिबग और स्थापित है। यह फेसलेस है। यदि आपको ऐसे कार्य की आवश्यकता है जो हर दूसरे, मिनट या घंटे में किया जाना चाहिए, तो आपको Windows सेवा का चयन करना चाहिए।
शेड्यूल्ड टास्क जल्दी विकसित होता है और उसका चेहरा होता है। यदि आपको दैनिक या साप्ताहिक कार्य की आवश्यकता है, तो आप अनुसूचित कार्य का उपयोग कर सकते हैं।