首页 > 解决方案 > 如果服务/进程已经停止,如何跳过告诉它停止

问题描述

我正在构建一个应用程序来卸载程序。

首先,我需要停止所有相关的服务和进程。

经过反复试验,我创建了以下命令:


///停止SQL和Act服务

        List<string> servicesList = new List<string>{
            "ACT! Service Host",
            "ACT! Smart Task Service Host",
            "ActConnectLink",
            "SQL Server (ACT7)",
            "SQL Server Browser",
            "Act! Scheduler",
            "APFWLicensingSrvc"
        };

        foreach (string serviceName in servicesList)


        {
            StopRunningService(serviceName);
        }


    private void StopRunningService(string name)
    {
        ServiceController service = new ServiceController(name);
        if (service.Status == ServiceControllerStatus.Running)
        {
            service.Stop();
        }

    }

唯一的问题是,如果服务已经停止或不存在(因为这是应用程序将删除我公司制作的 3 个略有不同的软件版本,因此有些将具有一些 API 功能和服务,有些则不会) ,然后测试失败,我得到:

System.InvalidOperationException:“在计算机“。”上找不到服务“服务名称”。

所以我想引入一个“If”命令来帮助它解决问题。

诸如“如果找到并正在运行服务”之类的内容,则让它继续停止服务。

从中我可以弄清楚如何对流程做同样的事情。

谁能指出我正确的方向?

标签: c#

解决方案


你可能会利用ServiceController.GetServices

检索计算机上的非设备驱动程序服务,以及那些不是驱动程序的服务。

var services = ServiceController.GetServices(machineName);

var servicesList = new List<string>
                        {
                           "ACT! Service Host",
                           "ACT! Smart Task Service Host",
                           "ActConnectLink",
                           "SQL Server (ACT7)",
                           "SQL Server Browser",
                           "Act! Scheduler",
                           "APFWLicensingSrvc"
                        };

var activeServices = services.Where(x => servicesList.Contains(x.ServiceName) && x.Status != ServiceControllerStatus.Stopped);
foreach (var service in activeServices)
{
   try
   {
      service.Stop();
   }
   catch (Exception e)
   {
      // maybe log something here
   }
}

注意:我并不是说这是解决您所有问题的方法,而是一个干净利落的解决方案。我只是指出如何获取名称和过滤已知服务


推荐阅读