यदि Windows सेवा चल रही है तो मैं कैसे सत्यापित कर सकता हूं


182

मेरे पास C # (2.0 XP पर चलने वाला 2.0) में एक एप्लिकेशन है जो एक 'वॉचडॉग' के साथ संचार कर रहा है जिसे विंडोज सेवा के रूप में लागू किया गया है। जब डिवाइस बूट होता है, तो यह सेवा आमतौर पर शुरू होने में कुछ समय लेती है। अगर सेवा चल रही है, तो मैं अपने कोड से जांच करना चाहता हूं। मैं यह कैसे हासिल कर सकता हूं?


1
कृपया .NET में ServiceController ऑब्जेक्ट पर एक नज़र डालें ।
लैरी

ऊह ... WMI के माध्यम से अपना खुद का रोल करने से भी बेहतर। मैं अपना उत्तर हटा दूंगा।
ईबीग्रीन

@EBGreen - मुझे नहीं पता, WMI मार्ग भविष्य में किसी और के लिए उपयोगी हो सकता है, एक बिल्ली की त्वचा के लिए एक से अधिक तरीका है, और वह सब ....
कार्ल

हां, लेकिन मुझे वास्तव में लगता है कि ServiceController सब पर बेहतर है, इसलिए मुझे लगता है कि मैं इसे हटा दिया जाएगा। मैंने कभी भी WMI का सुझाव नहीं दिया होता अगर मैं अभी नहीं उठा होता। :)
ईबीग्रीन

जवाबों:


366

मुझे लगता है कि कुछ इस तरह काम करेगा:

System.ServiceProcessअपने प्रोजेक्ट संदर्भों में जोड़ें (यह .NET टैब पर है)।

using System.ServiceProcess;

ServiceController sc = new ServiceController(SERVICENAME);

switch (sc.Status)
{
    case ServiceControllerStatus.Running:
        return "Running";
    case ServiceControllerStatus.Stopped:
        return "Stopped";
    case ServiceControllerStatus.Paused:
        return "Paused";
    case ServiceControllerStatus.StopPending:
        return "Stopping";
    case ServiceControllerStatus.StartPending:
        return "Starting";
    default:
        return "Status Changing";
}

संपादित करें: एक ऐसी विधि भी है sc.WaitforStatus()जो एक वांछित स्थिति और एक समय सीमा लेती है, इसका उपयोग कभी नहीं किया गया लेकिन यह आपकी आवश्यकताओं के अनुरूप हो सकता है।

संपादित करें: एक बार जब आप स्थिति प्राप्त करते हैं, तो स्थिति को फिर से प्राप्त करने के लिए आपको sc.Refresh()पहले कॉल करना होगा ।

संदर्भ: .NET में ServiceController ऑब्जेक्ट।


11
ServiceController.GetServices () एक सरणी को पुनः प्राप्त करता है जिसमें ServiceController ऑब्जेक्ट के रूप में सभी इंस्टॉल की गई सेवा होती है। इससे बहुत मदद मिल सकती है।
लैरी

9
System.ServiceProcess का संदर्भ जोड़ें और कथन जोड़ें: System.ServiceProcess का उपयोग करना;
नीलवैल्ट्स डेस

6
यदि मैंने एक खराब सेवा नाम पारित किया, तो यह एक त्रुटि फेंकने के बजाय लॉक करने के लिए लग रहा था। मैंने यह कोड जोड़ा: पकड़ (System.Exception पूर्व) {रिटर्न "नहीं मिला"; }
नीलवैलर्स

6
NealWalters: आप कैसे जानते हैं कि अपवाद सिर्फ इसलिए फेंक दिया गया क्योंकि सेवा नहीं मिली थी? क्या पकड़ने के लिए अधिक उपयुक्त अपवाद प्रकार नहीं है?
पैट्रिक स्वेन्सन

3
निजी स्थिर बूल ServiceExists (स्ट्रिंग सेवानाम) {return ServiceController.GetServices ()। FirstOrDefault (s => s.ServiceName == serviceName)! = null }
दिमित्री पावलोव

16

यहां आपको अपनी स्थानीय मशीन में सभी उपलब्ध सेवाएं और उनकी स्थिति मिलती है।

ServiceController[] services = ServiceController.GetServices();
foreach(ServiceController service in services)
{
    Console.WriteLine(service.ServiceName+"=="+ service.Status);
}

आप अपनी सेवा की तुलना लूप के अंदर सेवा.नाम संपत्ति से कर सकते हैं और आपको अपनी सेवा का दर्जा मिल सकता है। जानकारी के लिए http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.aspx पर जाएं भी http://msdn.microsoft.com/en-us/library/microsoft.windows.design पर जाएं .servicemanager (v = vs.90) .aspx

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.