2012-11-19 2 views
14

मैंने सी # में एक विंडोज सेवा लिखी है जो बहुत डेटा संसाधित करता है। जब हम इसे रोकते हैं तो इसे 20/30 सेकेंड के लिए प्रयास करें और फिर अपवाद फेंकता है।स्टॉप अनुरोध को संसाधित करने के लिए अधिकतम समय की सेवा सेवा क्या है और अतिरिक्त समय के लिए अनुरोध कैसे करें

मैं ऑनस्टॉप ईवेंट में ServiceBase.RequestAdditionalTime() को कार्यान्वित करना चाहता हूं।

मैं सटीक टाइमआउट जानना चाहता हूं जिसके बाद विंडोज सेवा अपवाद फेंकता है, ताकि मैं इससे पहले अतिरिक्त समय का अनुरोध कर सकूं।

मैंने खोज की लेकिन मुझे यह डिफ़ॉल्ट स्टॉप टाइमआउट मान नहीं मिला।

+1

आईआईआरसी 30 सेकंड है - http://www.itgeekdiary.com/increase-the-service-timeout-period/ – Lloyd

उत्तर

28

मैंने इसे प्राप्त करने के लिए निम्न कोड लिखा था।

protected override void OnStop() 
{ 
    int timeout = 10000; 
    var task = Task.Factory.StartNew(() => MyTask()); 
    while (!task.Wait(timeout)) 
    { 
     RequestAdditionalTime(timeout); 
    } 
} 

ऊपर कोड मुख्य थ्रेड के साथ-साथ किसी कार्य शुरू होता है (टास्क तुरन्त चालू हो जाने), अगली पंक्ति कार्य या हर 10 सेकंड पूरा नहीं होता है, तो जाँच करने के लिए है और यदि यह पूरा नहीं होता है यह अतिरिक्त अनुरोध करता है 10 सेकंड और कार्य पूरा होने तक जांचते रहें।

+1

+1। –

1

डिफ़ॉल्ट रूप से मेरा मानना ​​है कि यह 12000 मिलीसेकंड है, इसे बदलने के लिए आप \ नियंत्रण \ WaitToKillServiceTimeout \ CurrentControlSet रजिस्ट्री HKEY_LOCAL_MACHINE \ प्रणाली का उपयोग और मूल्य

बदलने की जरूरत है, लेकिन आप अगर आप चाहते हैं अपने खुद के समय बाहर परिभाषित कर सकते हैं इसे शुरू करने या इसे यहाँ प्रोग्रामिंग आप अपने खुद के समय बाहर परिभाषित रोक

TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds); 
service.Start(); 
service.WaitForStatus(ServiceControllerStatus.Running, timeout); 

शुरू करने के लिए और यहां आप

रोक के लिए अपने स्वयं के समय बाहर परिभाषित करने के लिए
+0

यह 'sc.exe' या "जैसे अंतर्निहित विंडोज टूल्स के साथ काम करते समय मदद नहीं करेगा। सेवाएं "एमएमसी एडिन। –

+0

सच है, लेकिन जो मैंने शामिल किया है वह रोकने के लिए है और व्याकरणिक रूप से –

+0

पुनरारंभ करना है, तो आपको उस तथ्य को इंगित करना चाहिए। क्योंकि कड़ाई से, यह ओपीएस सवाल का जवाब नहीं है। –

5

यह उपकुंजी पर रजिस्ट्री में सेट है:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control 

स्ट्रिंग मान WaitToKillServiceTimeout साथ। यदि परिभाषित नहीं किया गया है, तो यह 20000 (एमएस) तक डिफ़ॉल्ट है। मेरी मशीन पर यह 12000 (12 एस) पर सेट होने लगते हैं। मैंने इसे कभी छुआ नहीं है।

1

बस हमेशा RequestAdditionalTime निष्पादित करें, अधिकतम समय के साथ आप अपनी सेवा को बंद करने की आवश्यकता के साथ अपेक्षा करते हैं। भविष्यवाणी से पहले खत्म करने में कोई त्रुटि नहीं है।

+0

प्राप्त डेटा के आधार पर सेवा प्रक्रिया डेटा और यह अज्ञात आकार है, इसलिए मुझे नहीं पता कि इसे रोकने में कितना समय लगेगा। यह सभी डेटा –

+3

संसाधित करने से पहले नहीं रुकना चाहिए हां, यह चाहिए। प्राप्त डेटा डिस्क पर एक कतार में संग्रहीत किया जाना चाहिए (इसलिए अगर बिजली गिर जाती है तो कुछ भी नहीं खो जाता है) और वहां से संसाधित किया जाता है। मुख्य कारणों से मैं एक सेवा रोक रहा हूं ए) रीबूट (जिसे मैं जल्दी से प्राप्त करना चाहता हूं), और बी) यदि सेवा खराब होने लगती है (इस मामले में मैं निश्चित रूप से शेष अनुरोधों को संसाधित नहीं करना चाहता)। समाधान के लालित्य के लिए –

14

लोगों के एक नंबर HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WaitToKillServiceTimeout रजिस्ट्री कुंजी का उल्लेख किया है हालांकि, this "Service Control Handler" article from Microsoft कि रजिस्ट्री प्रविष्टि के अनुसार केवल नियंत्रण समय की अधिकतम राशि एक सेवा शट डाउन करना विंडोज ही बंद किया जा रहा है या को पुनः आरंभ कर सकते हैं:

< ...> बंद को रोकने से एक सेवा को रोकने के लिए, वहाँ कितनी देर तक सेवा नियंत्रक प्रतीक्षा करता है की एक सीमा होती है। यदि सेवा स्नैप-इन के माध्यम से बंद हो रही है, तो सीमा 125 सेकंड है। यदि ऑपरेटिंग सिस्टम रीबूट कर रहा है, तो समय सीमा WaitToKillServiceTimeout मान < में निर्दिष्ट है ...>

विंडोज को पुन: प्रारंभ या नीचे बंद करने की प्रक्रिया में नहीं है, तो डिफ़ॉल्ट समय विंडोज की राशि एक सेवा को बंद करने के लिए इंतजार करेंगे 30 सेकंड है। हालांकि, आवेदन अतिरिक्त समय के लिए अनुरोध कर सकते हैं, जिसे कुल 125 सेकंड तक सम्मानित किया जाएगा (सभी अनुरोधों में सम्मिलित)।

विंडोज सर्वर 2003 और बाद में, इस डिफ़ॉल्ट टाइमआउट this Microsoft support article (और this ServerFault question) में वर्णित के रूप HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServicesPipeTimeout रजिस्ट्री कुंजी के माध्यम से बदला जा सकता है, पर। यह स्पष्ट नहीं है कि यह विंडोज 7/8/10 पर लागू होता है, क्योंकि आलेख केवल सर्वर संस्करणों का उल्लेख करता है।

पुन: प्रारंभ करने/बंद मशीन पर शुरू कर दिया गया है, तो WaitToKillServiceTimeout रजिस्ट्री कुंजी मूल्य (यदि है), विंडोज की अनुमति देगा समय की अधिकतम राशि आवेदन की अनुमति दी जाएगी निर्दिष्ट करता है ओएस डिफ़ॉल्ट अधिभावी।

संभवतः ऐसा इसलिए है कि एप्लिकेशन डिफ़ॉल्ट रूप से शटडाउन में देरी से देरी नहीं कर सकते हैं (या व्यवस्थापक को WaitToKillServiceTimeout रजिस्ट्री प्रविष्टि के माध्यम से निर्दिष्ट किया गया है)।

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