无法使用.NET 3.5中的ServiceController停止服务
本文关键字:ServiceController 中的 服务 NET | 更新日期: 2023-09-27 17:58:30
我在.NET 3.5中工作,遇到了使用ServiceController停止某些服务的问题。我搜索了整个互联网,没有找到解决问题的办法;)
我是这样做的:
使用(ServiceController服务=新的ServiceController("服务")){尝试{TimeSpan timeout=TimeSpan.FromSeconds(timeoutSeconds);服务停止();服务WaitForStatus(ServiceControllerStatus.Stopped,超时);}catch(异常ex){Console.WriteLine(例如ToString());}}
我在等服务停止。然后我想替换它的库(更新它)。然后抛出异常:
未授权访问异常异常详细信息:System.UnauthorizedAccessException:拒绝访问路径"blablabla"
我确信我有权访问此路径,因为我以管理员身份运行我的应用程序。
有趣的是,当这段代码执行时,该服务从当前服务列表中消失(在任务管理器中)。所以它实际上停止了它,但一些线程必须仍然使用它,所以我不能移动任何服务的文件。即使我尝试自己移动文件(我转到服务目录并尝试用鼠标移动它的文件),我也无法做到。但当我手动停止服务(任务管理器和"结束任务")时,我可以对它的文件做任何我想做的事。那么,从C#代码(使用ServiceController)停止它和使用任务管理器停止它有什么区别呢?
我不知道这是否重要,但我在Windows Server 2008的Virtual Box中运行了此应用程序(和此服务)。(我需要在其他机器上运行它,然后再运行我的电脑)。
有什么想法可以解决这个问题吗?)
谢谢你的帮助。
致以最良好的祝愿,皮特。
好的,我解决了我的问题。
首先,我使用Net Stop
的Administrator Command-Prompt Command
来停止Service
,它有效,但我开始想为什么。答案是花了很多时间!ServiceController
实际上停止了它,但一些进程仍在使用它
service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
工作也很好,因为它同样改变了服务的状态(这只是Windows Services
列表中的一个更改),但礼貌地关闭所有使用特定服务的线程需要一些时间:)
所以你所需要做的就是等待,然后再次检查它是否还在运行。如果是,那么用Process
类杀死它。