Bir Windows Hizmetinin çalışıp çalışmadığını nasıl doğrulayabilirim


182

Windows hizmeti olarak uygulanan bir 'bekçi köpeği' ile iletişim kuran bir uygulama C # (XP XP üzerinde çalışan) var. Aygıt önyükleme yaptığında, bu hizmetin başlaması genellikle biraz zaman alır. Hizmetin çalışıp çalışmadığını kodumdan kontrol etmek istiyorum. Bunu nasıl başarabilirim?


1
Lütfen .NET'te ServiceController nesnesine bir göz atın .
Larry

Oooh ... WMI ile kendi yuvarlanmandan bile daha iyi Cevabımı kaldıracağım.
EBGreen

@EBGreen - Bilmiyorum, WMI yolu gelecekte başka biri için yararlı olabilir, bir kedi derisi için birden fazla yol var, ve tüm bunlar ....
Carl

Ya, ama gerçekten ServiceController her şeyden iyi olduğunu düşünüyorum, bu yüzden ben silinmiş bırakacağımı düşünüyorum. Sadece uyandırmamış olsaydım, WMI'yi asla öneremezdim. :)
EBGreen

Yanıtlar:


366

Sanırım böyle bir şey işe yarayacak:

System.ServiceProcessProje referanslarınıza ekleyin (.NET sekmesinde bulunur).

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";
}

Düzenleme: Ayrıca sc.WaitforStatus(), hiç kullanılmayan bir durum ve bir zaman aşımı süren bir yöntem vardır, ancak ihtiyaçlarınıza uygun olabilir.

Düzenleme: Durumu aldıktan sonra, durumu tekrar almak için sc.Refresh()önce aramanız gerekir .

Başvuru: .NET'te ServiceController nesnesi.


11
ServiceController.GetServices (), yüklü tüm hizmeti ServiceController nesnesi olarak içeren bir dizi alır. Bu çok yardımcı olabilir.
Larry

9
System.ServiceProcess'e başvuru ekleyin ve deyimi ekleyin: using System.ServiceProcess;
NealWalters

6
Kötü bir hizmet adı geçersem, bir hata atmak yerine kilitleniyor gibiydi. Bu kodu ekledim: catch (System.Exception ex) {return "Bulunamadı"; }
NealWalters

6
NealWalters: Sadece hizmet bulunamadığı için istisnanın atıldığını nereden biliyorsunuz? Yakalamak için daha uygun bir istisna türü yok mu?
Patrik Svensson

3
özel statik bool ServiceExists (string serviceName) {return ServiceController.GetServices (). FirstOrDefault (s => s.ServiceName == serviceName)! = null; }
Dmitry Pavlov

16

Burada mevcut tüm hizmetleri ve durumlarını yerel makinenizde bulabilirsiniz.

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

Hizmetinizi döngü içindeki service.name özelliği ile karşılaştırabilir ve hizmetinizin durumunu alabilirsiniz. Ayrıntılar için http://msdn.microsoft.com/tr-tr/library/system.serviceprocess.servicecontroller.aspx adresine gidin ve ayrıca http://msdn.microsoft.com/en-us/library/microsoft.windows.design .servicemanager (v = vs.90) .aspx

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.