2010-09-01 3 views
14

मैं एक सी # नेट विंडोज सेवा बना रहा हूं और सोच रहा हूं कि क्या आपको सेवा OnStop() विधि में हमेशा base.OnStop(); पर कॉल करना है और क्यों?क्यों बेस सर्विस कॉल करें। ओनस्टॉप() जब विंडोज सेवा बंद हो जाती है?

protected override void OnStop() 
{ 
    threadRunning = false; 

    this.ExitCode = 0; 
    base.OnStop(); 
} 
+1

आपके प्रश्न से संबंधित नहीं है, लेकिन ध्यान देने योग्य: 'thread.Abort();' का उपयोग न करें। – dtb

+0

@ डीटीपी, विधिवत –

उत्तर

12

प्रलेखन से ServiceBase.OnStop पर:

OnStop व्युत्पन्न वर्ग में अधिरोहित जा सकता है। की सेवा के लिए उपयोगी हो, ऑनस्टार्ट और ऑनस्टॉप दोनों को आपकी सेवा कक्षा में कार्यान्वित किया जाना चाहिए।

तो यह वास्तव में आपकी सेवा के लिए एक अधिसूचना के रूप में उपयोग किया जाता है जो यह रोक रहा है।

ServiceBase.cs के लिए .NET स्रोत कोड पर एक नज़र विधि कुछ नहीं करता है का पता चलता है:

protected virtual void OnStop() 
{ 
} 

तो, आप इसे कहते हैं की जरूरत है? नहीं, लेकिन ऐसा करने के लिए अभी भी अच्छा फॉर्म है। आधार कार्यान्वयन किसी दिन बदल सकता है।

+4

"इसे कॉल करने के लिए अच्छा" चीज एक मूर्ख विचार है। यदि आधार कार्यान्वयन कभी बदल गया - आप इसे कब कहते हैं? अपने कोड से पहले या बाद में? यह जानने के लिए बहुत सारे अज्ञात हैं कि कॉल करना है या नहीं, आप अंतराल को भरने के लिए दस्तावेज़ीकरण तक पूरी तरह से छोड़े गए हैं - इसलिए जब तक दस्तावेज़ आपको कॉल करने के लिए कहता है, तो मैं परेशान नहीं होता। आईएमओ - आधार विधि को कॉल करने की क्षमता एक मूर्ख विचार है और भाषा इसके बिना अच्छा होगा। : पी –

+6

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

6

आपको यह नहीं करना है। इसका मतलब यह है कि यदि आपने कभी भी ServiceBase और अपनी वास्तविक सेवा के बीच एक अतिरिक्त बेस क्लास डाला है, तो आप इसे ओवरराइड होने पर OnStop विधि कॉल करेंगे। मुझे विश्वास नहीं है ServiceBase.OnStop स्वयं कोई भी कार्य करता है।

आमतौर पर आईएमओ ओवरराइड करते समय बेस विधि को कॉल करना एक अच्छा विचार है, जब तक कि आप विशेष रूप से "सामान्य" व्यवहार को रोकने से नहीं रोकना चाहते ... लेकिन इस मामले में, कॉल को छोड़कर कोई भी नहीं होगा बुरा प्रभाव।

6

आपको इसकी आवश्यकता नहीं है।

ऑनस्टॉप सर्विसबेज में परिभाषित वर्चुअल विधि है जो आपको ओवरराइड करने की अनुमति देता है जहां आप सेवा को रोक सकते हैं। (कुछ हद तक) सामान्य मामले में, जब आप वर्चुअल विधि को ओवरराइड करते हैं, तो आप आधार वर्चुअल विधि को भी कॉल करते हैं। एकमात्र बार जब आप इसे कॉल नहीं करते हैं तो वह तब होता है जब आप सामान्य चीजों को होने से रोकना चाहते हैं।

सर्विसबेस के मामले में, ऑनस्टॉप कुछ भी नहीं करता है इसलिए आपको इसे कॉल करने की आवश्यकता नहीं है।

2

आपको वास्तव में उस कॉल को नहीं करना है। यदि आप रिफ्लेक्टर का उपयोग कर सर्विसबेस क्लास में ऑनस्टॉप विधि देखते हैं, तो आप देखेंगे कि यह कुछ भी नहीं करता है।