2011-08-10 7 views
5

मैं एक साधारण विंडोज सेवा बनाने के लिए .Net 4 का उपयोग कर रहा हूं, समस्या तब होती है जब मैं सेवा शुरू करने से पहले 5 मिनट की देरी करना चाहता हूं।विंडोज सेवा शुरू करने से पहले 5 मिनट में देरी कैसे करें?

protected override void OnStart(string[] args) 
{ 
    // make a 5 min delay 
    // do something 
} 

लेकिन कुछ सेकंड बाद सेवा बंद हो जाती है और मुझे त्रुटि का समय देता है (इसे ईवेंट-लॉग में देखा गया)। मुझे क्या लगता है?

+1

क्यों आप इस चाहते हैं? – TJHeuvel

उत्तर

5

एक नया सूत्र में अपने लंबी प्रक्रिया आरंभ हो जाएंगे, इसलिए OnStart विधि को ब्लॉक नहीं करती। उदाहरण:

using System.Threading; 

protected override void OnStart(string[] args) 
{ 
    ThreadPool.QueueUserWorkItem(new WaitCallback((_) => 
    { 
     Thread.Sleep(5 * 1000 * 60);//simulate 5 minutes work 

     // do something 
    })); 
} 
+1

हां। अच्छा विचार। ऑपरेटिंग सिस्टम से विंडोज़ देरी सेवा शुरू करने के विकल्पों को अनदेखा करें, फिर उनके चारों ओर हैंडकोड करें। – TomTom

+0

@ टॉमटॉम: 'हां। अच्छा विचार। ऑपरेटिंग सिस्टम से विंडोज़ देरी सेवा शुरू करने के विकल्पों को अनदेखा करें, फिर उनके चारों ओर हैंडकोड करें। फिर -1 क्यों? क्या आप इसे गलती से करते हैं ?? –

+2

टॉमटॉम आप खिड़कियों के सभी संस्करणों को खारिज कर रहे हैं, देरी सेवा विकल्पों का समर्थन करते हैं, क्योंकि मैं विंडोज 2003 का उपयोग कर रहा हूं। –

3

न। जब पूछे जाने पर सेवाओं को शुरू करना होगा। OnStartवापस लौटना है। तेज़

उस ने कहा, सेवा तब तक 5 मिनट तक प्रतीक्षा कर सकती है जब तक कि कुछ कुछ करें, लेकिन आप स्टार्टअप चक्र को रोक नहीं सकते हैं।

यह प्रारंभ करें, फिर कार्यकर्ता धागा इंतजार जब तक यह कुछ करता है।

यानी, एक विन्यास प्रविष्टि की अनुमति देता है कि एक सेवा देरी से शुरू किया जा रहा है। यह सेवा के लिए कॉन्फ़िगर किया गया है, Manual, Automatic की तरह delayed प्रविष्टि है। यह सुनिश्चित करता है कि सेवा केवल तब शुरू होती है जब मशीन से शुरू होने से निपटने के लिए थोड़ा समय होता है। यह बेहतर/अच्छा हो सकता है।

+0

क्या आप कॉन्फ़िगरेशन एंट्री के बारे में अधिक समझा सकते हैं? कृप्या। –

+0

विंडोज़ सेवा कॉन्फ़िगरेशन खोलें, विकल्पों को देखें, Google का उपयोग करें। मुश्किल नहीं है, चलो। यह मुझे करने दो। Google "विंडोज सर्विस स्टार्टअप विलंबित", दूसरी प्रविष्टि है ... http://www.techrepublic.com/blog/datacenter/delayed-start-feature-increases- विकल्प-for-windows-services/1552 – TomTom

+0

@TomTom यह होगा अच्छा समाधान हो, लेकिन यह केवल Win7, Vista और 2008 सर्वर पर समर्थित है ... – Incognito

1

एक सेवा प्रतिक्रिया करने के लिए जब यह शुरू करने के लिए कहा है है, या Windows अपने खराब सोचता है। तो अगर आप दो विकल्प हैं:

  1. एक अलग अनुप्रयोग है कि स्टार्टअप पर चलता लिखें, 5 मिनट इंतजार कर रहा है, और उसके बाद सेवा शुरू होता है।

  2. सेवा प्रारंभ करें, और उस में एक पांच मिनट की देरी डाल से पहले यह कर शुरू होता है जो कुछ भी यह व्यापार तर्क है

    । जब तक विंडोज सोचता है कि यह सामान्य रूप से शुरू हुआ, तो यह खुश है।

कुछ इस तरह:

private static Timer t; 
protected override void OnStart(string[] args) 
{ 
    t = new Timer(5000*60); 
    t.Elapsed += new ElapsedEventHandler(OnTimedEvent) 
    t.Start() 
} 

private static void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    // real code here 
} 
2

OnStart विधि अन्यथा आप एक समय बाहर त्रुटि प्राप्त होगी एक समय पर फैशन में वापस जाने के लिए की जरूरत है।

आप क्या करने की जरूरत OnStart से एक धागा शुरू करने और उस सूत्र में वास्तव में अपने सेवा शुरू करने से पहले 5 मिनट तक प्रतीक्षा है। तो अपने OnStart विधि हो जाता है:

serviceThread = new Thread(new ThreadStart(workerClass.WorkerMethod)); 

serviceThread.Start(); 

और WorkerClass.WorkerMethod सेवा की वास्तविक प्रारंभ करता है।

1

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

protected override void OnStart(string[] args) 
     {    
      Thread processor= new Thread(ThreadProc); 
      processor.Start(); 
     } 

     private void ThreadProc() 
     { 
      while (true) 
      { 
       Thread.Sleep(TimeSpan.FromMinutes(5)); 

      } 
     } 
1

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

protected override void OnStart(string[] args) 
    { 
     try 
     { 
      // Using a timer Event to start asynchronously 
      StartupTimer = new Timer(); 
      StartupTimer.Elapsed += StartupTimer_Elapsed; 
      StartupTimer.AutoReset = false; 
      StartupTimer.Interval = 5*60*1000; 
      StartupTimer.Start(); 
     } 
     catch (Exception ex) 
     { 
      LogMessage(true, ex.ToString()); 
     } 
    } 

    private void StartupTimer_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     try 
     { 
      RunSetup(true); 
     } 
     catch (Exception ex) 
     { 
      LogMessage(true, ex.ToString()); 
     } 
    } 
0

एक सीधे आगे रास्ता System.Threading.Timer का उपयोग करें और, तो अधिक जानकारी के लिए System.Threading.Timer देखने के सेट 5 मिनट के लिए यह वजह से समय आ गया है के लिए है।

0

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

आप इसे विंडोज़ को पहले बताकर ठीक कर सकते हैं कि इस सेवा को शुरू करने में कुछ समय लगेगा।

ऐसा करने के लिए यह इस तो सवाल का जवाब देखें: windows service startup timeout

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