c# - 如果服务/进程已经停止,如何跳过告诉它停止
问题描述
我正在构建一个应用程序来卸载程序。
首先,我需要停止所有相关的服务和进程。
经过反复试验,我创建了以下命令:
///停止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”命令来帮助它解决问题。
诸如“如果找到并正在运行服务”之类的内容,则让它继续停止服务。
从中我可以弄清楚如何对流程做同样的事情。
谁能指出我正确的方向?
解决方案
你可能会利用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
}
}
注意:我并不是说这是解决您所有问题的方法,而是一个干净利落的解决方案。我只是指出如何获取名称和过滤已知服务
推荐阅读
- python - Pipenv 锁定失败:错误:找不到 pg_config 可执行文件
- authentication - Microsoft Graph:如何在客户端凭据流中使用证书获取访问令牌?(而不是使用 client_secret)
- android - Android Studio 无法再签署生产应用程序了
- mysql - 当我从表中选择数据以获取元组中的数据时,使用 python 和 mysql 连接器。我需要 dict(key:value 对)
- next.js - Nextjs 不能在 getStaticProps 或 getServerSideProps 中使用导入变量
- python - InvalidArgumentError:不兼容的形状:(无法解决此错误)
- typescript - TypeScript 索引签名继承的普通类型
- dart - 带宽速度测试比预期慢
- python - AttributeError:模块“torchvision.models”没有属性“mobilenet_v3_small”
- google-chrome-extension - 两个后台脚本之间的 sendMessage/onMessage.addListener 不起作用