gpt4 book ai didi

c# - 无法在 .NET 3.5 中使用 ServiceController 停止服务

转载 作者:行者123 更新时间:2023-12-02 05:15:07 24 4
gpt4 key购买 nike

我在 .NET 3.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());    }}

我在等我的服务停止。然后我想替换它的库(更新它)。并抛出异常:

未授权访问异常异常详细信息:System.UnauthorizedAccessException:拒绝访问路径“blablabla”。

我确定我有权访问此路径,因为我以管理员身份运行我的应用程序。

有趣的是当这段代码执行时,这个服务从当前服务列表中消失(在任务管理器中)。所以它实际上停止了它,但一些线程仍然必须使用它,所以我不能移动任何服务的文件。即使我尝试自己移动文件(我转到服务目录并尝试使用鼠标移动它的文件),我也做不到。但是当我手动停止服务时(任务管理器和“结束任务”)我可以用它的文件做任何我想做的事。那么从 C# 代码(使用 ServiceController)停止它和使用任务管理器停止它有什么区别?

我不知道它是否重要,但我在 Virtual Box 中的 Windows Server 2008 上运行此应用程序(和此服务)。 (我需要在其他机器上然后在我的电脑上运行它)。

有什么办法可以解决这个问题吗? ;)

感谢您的帮助。

祝你好运,皮特。

最佳答案

好的,我解决了我的问题。

首先,我使用 Net StopAdministrator Command-Prompt Command 来停止 Service 并且它有效 ,但我开始想知道为什么。答案是花了很多时间!ServiceController 实际上停止了它,但一些进程仍在使用它。

 service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);

也很好,因为它直接改变了服务的状态(这只是 Windows Services 列表中的一个改变),但是礼貌地关闭所有使用特定服务的线程需要一些时间:)

所以您需要做的只是等待,然后再次检查它是否仍在运行。如果是,则使用 Process 类将其终止。

关于c# - 无法在 .NET 3.5 中使用 ServiceController 停止服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14783354/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com