C# 无法使用.NET 3.5中的ServiceController停止服务
我在.NET3.5中工作,在使用ServiceController停止某些服务时遇到问题。我搜索了整个互联网,没有找到解决问题的方法;) 我是这样做的: using (ServiceController service = new ServiceController("Service")) { try { TimeSpan timeout = TimeSpan.FromSeconds(timeoutSeconds); service.Stop(); service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } 使用(ServiceController服务=新ServiceController(“服务”)) { 尝试 { TimeSpan timeout=TimeSpan.FromSeconds(timeoutSeconds); 服务。停止(); service.WaitForStatus(ServiceControllerStatus.Stopped,超时); } 捕获(例外情况除外) { Console.WriteLine(例如ToString()); } } 我在等我的服务停止。然后我想替换它的库(更新它)。然后抛出异常: 未经授权的访问例外 异常详细信息:System.UnauthorizedAccessException:对路径“blabla”的访问被拒绝 我确信我有权访问此路径,因为我以管理员身份运行我的应用程序 有趣的是,当执行这段代码时,该服务将从当前服务列表中消失(在任务管理器中)。所以它实际上停止了它,但是一些线程仍然要使用它,所以我不能移动任何服务的文件。即使我尝试自己移动文件(我去服务目录并尝试使用鼠标移动它的文件),我也做不到。但是当我手动停止服务(任务管理器和“结束任务”)时,我可以对它的文件做任何我想做的事情。那么,从C代码(使用ServiceController)停止它和使用任务管理器停止它有什么区别呢 我不知道这是否重要,但我在Windows Server 2008的Virtual Box中运行了此应用程序(和此服务)。(我需要在其他机器上运行它,然后在我的计算机上运行) 有什么办法可以解决这个问题吗?;) 谢谢你的帮助 致以最良好的祝愿,C# 无法使用.NET 3.5中的ServiceController停止服务,c#,.net,service,windows-services,servicecontroller,C#,.net,Service,Windows Services,Servicecontroller,我在.NET3.5中工作,在使用ServiceController停止某些服务时遇到问题。我搜索了整个互联网,没有找到解决问题的方法;) 我是这样做的: using (ServiceController service = new ServiceController("Service")) { try { TimeSpan timeout = TimeSpan.FromSeconds(timeoutSeconds); service.Stop()
皮特。好的,我解决了我的问题 首先,我使用
Net Stop
的Administrator命令提示符命令
停止服务
,它工作了,但我开始想为什么。答案是花了很多时间!
ServiceController
实际上已经停止了它,但一些进程仍在使用它
service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
还可以,因为它确实更改了服务的状态(这只是Windows服务列表中的一个更改),但是礼貌地关闭使用特定服务的所有线程需要一些时间:)
所以,您只需等待,然后再次检查它是否仍在运行。如果是,则使用
进程
类将其杀死。可以使用任务管理器
停止代码的原因是它已经有管理员令牌。为了让您的应用程序操作服务
,您需要模拟或验证您的应用程序是否处于适当的管理员级别。这可以通过Windows主体程序集
完成。您的另一个选项是启动进程
,该进程将运行管理员命令提示符命令Net Stop
,以停止服务
。然后在完成任务后再次调用进程
,重新启动。您没有使用任务管理器停止服务,而是将其终止。很大的不同。@Greg我考虑过了,但我也认为如果我们有像ServiceController这样的东西,我可以用它来控制我的服务,但在这种情况下,我必须按照你写的那样做,并使用“net stop”,谢谢你的回答@好吧,那么阻止它和杀死它有什么区别呢?哪些线程仍然使用此服务(或此服务的文件)?杀死它会突然停止它。停止可确保所有组件正确关闭。