2008-10-19 21 views
50

सेवा प्रति स्टार्टअप टाइमआउट के लिए एक अलग मूल्य निर्धारित करने का कोई तरीका है? मैं इसे ServicesPipeTimeout रजिस्ट्री कुंजी का उपयोग करके बदल सकता हूं, लेकिन यह प्रति मशीन (http://support.microsoft.com/kb/824344) है।विंडोज सेवा स्टार्टअप टाइमआउट

इस समय एकमात्र चीज जो मैंने सोचा था वह एक अलग धागे में सभी समय लेने वाली स्टार्टअप कार्रवाइयां करना था।

उत्तर

35

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

+10

भालू ध्यान में रखें कि यदि कोई अन्य सेवा स्वयं पर निर्भर है तो संभवतः यह आपकी सेवा को SERVICE_RUNNING पोस्ट करने के बाद पूरी तरह कार्यात्मक होने की उम्मीद करेगी। SERVICE_RUNNING पोस्ट करने से पहले अपने प्रारंभिकरण के _all_ को पूरा करने का एक अच्छा कारण है, और SetServiceStatus के साथ आवश्यक होने पर अधिक समय मांगना। –

78

मैं रोमुलो से जितनी जल्दी हो सके अपनी सेवा शुरू करने के लिए परिष्करण पर सहमत हूं। हालांकि, अगर आपको समय चाहिए और आप .NET Framework 2.0 या बाद में उपयोग कर रहे हैं, तो आप ServiceBase.RequestAdditionalTime() विधि पर विचार कर सकते हैं।

http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.requestadditionaltime.aspx

protected override void OnStart() 
{ 
    this.RequestAdditionalTime(10000); 
    // do your stuff 
} 
+1

धन्यवाद, इससे मुझे बहुत मदद मिली! मुझे कुछ पुराना कोड मिला है और इसे चलाने के लिए आवश्यक है ... – Turrau

+0

चेतावनी, संभावित चेतावनी: "HostControl के लिए प्रलेखन क्या है।RequestAdditionalTime राज्य में विफल रहता है कि आप केवल अधिकतम 60 या 120 सेकंड के लिए पूछ सकते हैं। अन्यथा यह आपके अनुरोध को अनदेखा करता है। "(यहां से: https://stackoverflow.com/questions/19589686/topshelf-timeout-issue, इसे सत्यापित नहीं किया है, लेकिन विचार करने लायक है) –

1

मैं भी एक सेवा कुछ ही सेकंड/मिनट लगते हैं हो सकता है जो एक अच्छी शुरुआत के लिए का सामना करना पड़ा। जब सेवा शुरू होती है, तो यह SQL सर्वर से कनेक्ट करने का प्रयास करता है। हालांकि, जब पूरा सर्वर पुनरारंभ किया गया था, तो मेरी सेवा SQL सर्वर से पहले शुरू हो रही थी। (मुझे सेवा निर्भरता के बारे में पता है लेकिन यह किसी विशेष कारण के लिए मेरी स्थिति पर लागू नहीं होता ....)। मैंने SQL सर्वर से कनेक्ट करने के लिए 10 बार कोशिश करने के लिए एक लूप करने की कोशिश की, लेकिन टाइमआउट की वजह से विंडोज दूसरी कोशिश से पहले मेरी सेवा को मार रहा था।

मेरा समाधान: मैंने अपनी सेवा के "ऑनस्टार्ट()" में एक टाइमर जोड़ा। फिर, सेवा की "ऑनटिक()" विधि SQL सर्वर से कनेक्ट करने के लिए 10 बार कोशिश कर रही थी (इसमें 30 की प्रतीक्षा के साथ)। स्टार्टअप पर टाइमआउट नहीं।

तो बुनियादी तौर पर,

  • मेरी सेवा 5 सेकंड में शुरू होता है।
  • सेवा के शुरू होने के 10 सेकंड बाद एक टाइमर लॉन्च किया गया है।
  • टाइमर एसक्यूएल सर्वर से कनेक्ट होने पर 10 बार [हर बार 30 सेकंड प्रतीक्षा]] पर प्रयास करता है।
  • यदि यह सफल होता है, तो टाइमर स्वयं को अक्षम कर देगा, अगर नहीं (10 कोशिश के बाद), तो मैं सेवा को रोकता हूं।

नोट समस्या को हल करने के लिए और अधिक सुरुचिपूर्ण तरीका लेकिन शायद मेरी समाधान मुझ से एक ही स्थिति में किसी को भी मदद मिल सकती है के कुछ हिस्से,

2

, बस एक और धागा में timeintensive चीजें करते

protected override void OnStart(string[] args) 
    { 
     var task = new Task(() => 
     { 
      // Do stuff 
     }); 
     base.OnStart(args); 
     task.Start(); 
    } 
+0

आपको यहां सावधान रहना होगा क्योंकि अगर'// चीजें करें 'अपवाद फेंकता है, यह सेवा को रोकने/क्रैश करने के बजाए निगल लिया जाएगा, जिसे आप वास्तव में चाहते हैं ताकि आप जान सकें कि सेवा "काम नहीं कर रही" की बजाय काम नहीं कर रही है, लेकिन वास्तव में कुछ भी नहीं कर रही है या ठीक से काम नहीं कर रही है । – deadlydog

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