2008-10-07 9 views
150

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

उत्तर

290

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

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

त्वरित तरीका:

return new ServiceController(SERVICE_NAME).Status == ServiceControllerStatus.Running; 

सुरक्षित तरीका:

try 
{ 
    using(ServiceController sc = new ServiceController(SERVICE_NAME)) 
    { 
     return sc.Status == ServiceControllerStatus.Running; 
    } 
} 
catch(ArgumentException) { return false; } 
catch(Win32Exception) { return false; } 

वर्बोज़ रास्ता:

using System.ServiceProcess; 

// 

ServiceController sc; 
try 
{ 
    sc = new ServiceController(SERVICE_NAME); 
} 
catch(ArgumentException) 
{ 
    return "Invalid service name."; // Note that just because a name is valid does not mean the service exists. 
} 

using(sc) 
{ 
    ServiceControllerStatus status; 
    try 
    { 
     sc.Refresh(); // calling sc.Refresh() is unnecessary on the first use of `Status` but if you keep the ServiceController in-memory then be sure to call this if you're using it periodically. 
     status = sc.Status; 
    } 
    catch(Win32Exception ex) 
    { 
     // A Win32Exception will be raised if the service-name does not exist or the running process has insufficient permissions to query service status. 
     // See Win32 QueryServiceStatus()'s documentation. 
     return "Error: " + ex.Message; 
    } 

    switch(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() पर कॉल करने की आवश्यकता होगी।

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

+9

ServiceController.GetServices() एक सरणी पुनर्प्राप्त करता है जिसमें सभी स्थापित सेवा ServiceController ऑब्जेक्ट के रूप में होती है। यह बहुत मदद कर सकता है। – Larry

+0

अच्छी कॉल, मुझे नहीं पता कि मैंने कभी इसका उपयोग किया है या नहीं। यहां तक ​​कि यदि आप इसका कभी भी उपयोग नहीं करते हैं, तो मुझे लगता है कि यह डिबगिंग के लिए उपयोगी होगा यदि कुछ और नहीं – Carl

+8

sc.WaitforStatus() बिल्कुल वही था जो मुझे चाहिए। Thx – edosoft

18

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

+2

Oooh ... WMI के माध्यम से स्वयं को रोल करने से भी बेहतर है। मैं अपना जवाब हटा दूंगा। – EBGreen

+3

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

+1

हां, लेकिन मुझे सच में लगता है कि ServiceController बेहतर है सब से, तो मुझे लगता है कि मैं इसे हटा दूंगा। अगर मैंने अभी जाग नहीं लिया तो मैंने कभी भी डब्ल्यूएमआई का सुझाव नहीं दिया होगा। :) – EBGreen

9

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

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

आप लूप के अंदर service.name प्रॉपर्टी के साथ अपनी सेवा की तुलना कर सकते हैं और आपको अपनी सेवा की स्थिति मिलती है। विवरण के लिए 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

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

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