Làm cách nào để xác minh xem Windows Service có đang chạy không


182

Tôi có một ứng dụng trong C # (2.0 chạy trên XP được nhúng) đang liên lạc với một 'cơ quan giám sát' được triển khai như một Dịch vụ Windows. Khi thiết bị khởi động, dịch vụ này thường mất một thời gian để bắt đầu. Tôi muốn kiểm tra, từ mã của tôi, nếu dịch vụ đang chạy. Làm thế nào tôi có thể thực hiện điều này?


1
Xin hãy xem đối tượng ServiceContoder trong .NET.
Larry

Oooh ... thậm chí còn tốt hơn là tự lăn qua WMI. Tôi sẽ xóa câu trả lời của tôi.
EBGreen

@EBGreen - Tôi không biết, tuyến đường WMI có thể hữu ích cho người khác trong tương lai, có nhiều hơn một cách để nuôi mèo và tất cả những điều đó ....
Carl

Ya, nhưng tôi thực sự nghĩ ServiceContoder tốt hơn tất cả, vì vậy tôi nghĩ rằng tôi sẽ để nó bị xóa. Tôi thậm chí sẽ không bao giờ đề nghị WMI nếu tôi không thức dậy. :)
EBGreen

Câu trả lời:


366

Tôi đoán một cái gì đó như thế này sẽ làm việc:

Thêm vào System.ServiceProcesstài liệu tham khảo dự án của bạn (Nó trên tab .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";
}

Chỉnh sửa: Ngoài ra còn có một phương pháp sc.WaitforStatus()có trạng thái mong muốn và thời gian chờ, không bao giờ sử dụng nó nhưng nó có thể phù hợp với nhu cầu của bạn.

Chỉnh sửa: Khi bạn nhận được trạng thái, để có được trạng thái một lần nữa, bạn sẽ cần gọi sc.Refresh()trước.

Tham khảo: Đối tượng ServiceControll trong .NET.


11
ServiceControll.GetService () lấy một mảng có chứa tất cả các dịch vụ được cài đặt dưới dạng đối tượng ServiceControll. Điều này có thể giúp rất nhiều.
Larry

9
Thêm tham chiếu đến System.ServiceProcess và thêm câu lệnh: bằng System.ServiceProcess;
NealWalters

6
Nếu tôi thông qua một tên dịch vụ tồi, nó dường như bị khóa thay vì ném lỗi. Tôi đã thêm mã này: Catch (System.Exception ex) {return "Không tìm thấy"; }
NealWalters

6
NealWalters: Làm thế nào để bạn biết ngoại lệ bị ném chỉ vì dịch vụ không được tìm thấy? Không có loại ngoại lệ phù hợp hơn để bắt?
Patrik Svensson

3
private static bool ServiceExists (chuỗi serviceName) {return ServiceContoder.GetService (). FirstOrDefault (s => s.ServiceName == serviceName)! = null; }
Dmitry Pavlov

16

Tại đây bạn có được tất cả các dịch vụ có sẵn và trạng thái của chúng trong máy cục bộ của bạn.

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

Bạn có thể So sánh dịch vụ của mình với thuộc tính service.name bên trong vòng lặp và bạn có được trạng thái dịch vụ của mình. Để biết chi tiết, hãy truy cập http://msdn.microsoft.com/en-us/l Library / system.service Process.servicecontroll.aspx cũng http://msdn.microsoft.com/en-us/l Library / microsoft.windows.design .servicemanager (v = vs.90) .aspx

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.