2010-06-17 30 views
5

में लंबी शुरुआत प्रारंभ करें जब सेवा सेवा प्रबंधक को अवरुद्ध किए बिना विंडोज सेवा शुरू होती है (या रोके जाने से फिर से शुरू होती है) कुछ प्रारंभिक प्रारंभ करने का सबसे अच्छा तरीका क्या है?विंडोज सेवा

उत्तर

9

आप सेवा के जवाब में अपना लंबा ऑपरेशन करने के लिए BackgroundWorker का उपयोग कर सकते हैं। स्टार्ट इवेंट।

ServiceBase -edived कक्षा के OnStart() विधि में ऐसा करना आसान है। एक उचित good example on MSDN भी है।

protected override void OnStart(string[] args) 
{ 
    var worker = new BackgroundWorker(); 
    worker.DoWork += DoSomeLongOperation; 

    worker.RunWorkerAsync(); 
} 

private void DoSomeLongOperation(object sender, DoWorkEventArgs e) 
{ 
    // do your long operation... 
} 

ध्यान दें कि आप भी, ProgressChanged और RunWorkerCompleted घटनाओं के लिए सदस्यता ले सकते हैं, ताकि आप अपनी प्रगति के सेवा नियंत्रण प्रबंधक को सूचित और सफलता (या विफलता) प्रारंभ करेंगे कर सकते हैं।

1

मुझे यह भी करना है: मैं स्टार्टअप पर एक धागा उत्पन्न करता हूं जो इसके सभी प्रारंभिक कार्य करता है और इसे समाप्त होने पर एक निजी 'प्रारंभ किया गया' सेट करता है। यह सेवा समय-समय पर कार्य करती है (यानी, टाइमर पर) और यदि प्रारंभ किया गया है तो यह क्रियाएं शुरू नहीं होंगी।

1

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

0

सबसे अच्छा व्यावहारिक तरीका एक कामकाजी धागा बना रहा है।

आम तौर पर एक अन्य दस्तावेज तरीका मौजूद है, जिसे मैं अप्रबंधित कोड के उदाहरण पर समझा सकता हूं। प्रारंभिकरण के दौरान एक विंडोज सेवा के पास ऐसा करने का एक छोटा सा समय होता है। इस बार रजिस्ट्री में कहीं भी बदला जा सकता है। सेवा अधिक की जरूरत है, तो dwCurrentState=SERVICE_START_PENDING कुछ dwCheckPoint और dwWaitHint साथ

SetServiceStatus कॉल कर सकते हैं भरा ताकि dwWaitHint अनुमानित समय मिलीसेकंड में एक लंबित शुरू संचालन के लिए आवश्यक है SERVICE_STATUS struct की,। निर्दिष्ट समय बीत जाने से पहले, सेवा को अगली कॉल SetServiceStatus फ़ंक्शन को बढ़ी हुई dwCheckPoint मान या dwCurrentState में परिवर्तन के साथ करनी चाहिए। http://msdn.microsoft.com/en-us/library/ms685996(VS.85).aspx पर dwWaitHint का विवरण देखें।

1

मुझे विंडोज़ सेवा के साथ यह समस्या भी थी। मुझे लगता है कि आपको प्रारंभिक तर्क 30 सेकंड के तहत रखना है, अन्यथा विंडोज सेवा प्रबंधक सेवा को रोक देगा।

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

आप वर्ग के एक पैरामीटर के रूप में टाइमर घोषित करना चाहिए:

public partial class YourService: ServiceBase 
{ 
    System.Timers.Timer tmrOnStart; 

फिर onStart विधि

protected override void OnStart(string[] args) 
{ 
    //set the interval to 20 seconds 
    tmrOnStart = new Timer(); 
    tmrOnStart.Interval = 20000; 
    tmrOnStart.Enabled = true; 
    tmrOnStart.AutoReset = false; 
    tmrOnStart.Elapsed += new ElapsedEventHandler(tmrOnStart_Elapsed); 
    tmrOnStart.Start(); 
} 

में टाइमर प्रारंभ जब टाइमर बीत चुके घटना को ट्रिगर किया जाएगा, यह निष्पादित करेंगे यह विधि:

void tmrOnStart_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    heavyBusinessLogicMethod(); 
} 

और आपको अपने तर्क को भारी बुशिन में रखना होगा ssLogicMethod विधि।