2011-09-16 6 views
7

हमारे पास एक .NET विंडोज सेवा है जो लेनदेन के तरीके से ए से बी तक बहुत अधिक महत्वपूर्ण डेटा को फावड़ा देती है। हमें यह सुनिश्चित करने की भी आवश्यकता है कि सेवा में उपयोग किए जाने वाले सभी बाहरी कंपोनेंट्स को सही तरीके से आवंटित नहीं किया जाता है और सेवा को बंद करने से पहले सब कुछ साफ हो जाता है। इसमें कुछ घंटे लग सकते हैं! इसका कारण यह है कि सेवा को बाहरी घटक के कॉलबैक पर प्रतीक्षा करने की आवश्यकता होती है, जो 2, 3, या 4 घंटे बाद आती है।क्या विंडोज़ सेवा को बंद करने के लिए घंटों लग सकते हैं?

  1. यह विंडोज शान से बंद करने के लिए एक सेवा के लिए इतना लंबा इंतजार करने के लिए संभव है?
  2. ऐसी सेवा में विकल्प हैं जहां मैं यह निर्धारित कर सकता हूं कि सेवा ऑपरेटिंग सिस्टम द्वारा बंद की जा रही है, उदाहरण के लिए को बंद करें पूरी तरह से बंद करें?
  3. भी, एक और परिदृश्य के रूप में, क्या होता है यदि सर्वर को रीबूट की आवश्यकता होती है? क्या यह सेवा के लिए घंटों तक इंतजार कर सकता है?
  4. क्या इस पर कोई सीमा है कि ओएस इसे मारने से पहले सेवा पर कितनी देर तक इंतजार करेगा?
+6

आप भूल गए: 5. वहाँ कितनी देर तक एक व्यक्ति कि मशीन ठीक से बंद करने के लिए के लिए इंतजार करेंगे पर कोई सीमा है प्लग खींचने से पहले? –

उत्तर

7

आप CanStop, CanShutdown, CanHandlePowerEvent का उपयोग कर सकते हैं जब कंप्यूटर बंद हो रहा है और पर्याप्त प्रतिक्रिया दे।

अतिरिक्त समय का अनुरोध करने के ServiceBase.RequestAdditionalTime विधि का प्रयोग कर अपने धागा समाप्त करने के लिए:

protected override void OnShutdown() 
{ 
    base.RequestAdditionalTime(MaxTimeout); 
    serviceCore.OnShutdown(); 
    Stop(); 
} 

यदि आपका OnShutdown() से अधिक समय के 20 सेकंड के लिए ब्लॉक (रजिस्ट्री HKEY_LOCAL_MACHINE \ प्रणाली में संग्रहीत डिफ़ॉल्ट मान \ CurrentControlSet \ नियंत्रण \ WaitToKillServiceTimeout), आपकी सेवा को उत्तरदायी और मार डाला जाएगा।

There is a good blog post from the BCL team on that subject that I recommend.

+2

'ऑनशूटडाउन' के भीतर 'RequestAdditionalTime 'को कॉल करने से' अवैधऑपरेशन अपवाद' होगा। –

4

हां एक सेवा पूर्ण होने तक बंद हो सकती है, लेकिन इसे चाहिए? इसके लिए रजिस्ट्री में टाइमआउट मान हैं, ओएस क्या है?

मुझे लगता है कि आपको अन्य घटक से कॉलबैक को डीक्यूपल करने की आवश्यकता है, या डिस्क को डेटा में बफर करने और छोटे टुकड़ों में भेजने की आवश्यकता है। पावरकट में क्या होता है? या अगर कोई इंतजार कर रहा है और इंतजार कर रहा है?

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

+0

हां डेटा एक अर्थ में महत्वपूर्ण है। यह एक एंटरप्राइज़ लेवल एप्लिकेशन है जहां बड़ी मात्रा में डेटा ले जाया जा रहा है, पार्स किया गया है, और अनुक्रमित किया जा रहा है। समस्या यह है कि घटक धीरे-धीरे काम करता है। किसी भी समय होने के लिए 20,000 कॉलबैक होने का इंतजार हो सकता है, जो आंशिक रूप से ऐसा क्यों लगता है। मतदान एक विकल्प नहीं है क्योंकि इसकी एपीआई हमें अनुमति नहीं देती है। – John

+0

यह गड़बड़ है, निश्चित रूप से प्रत्येक कॉल में कई घंटे नहीं लगते हैं? क्या आप छोटे बैचों का उपयोग कर सकते हैं, और कई मशीनों में कॉल वितरित कर सकते हैं? – TheCodeKing

0

आप उपयोग नहीं कर सकते RequestAdditionalTime (MaxTimeout) OnShutdown() के अंदर ...

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