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

时间:2013-02-09 00:05:45

标签: c# .net service windows-services servicecontroller

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

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

UnauthorizedAccessException 异常详细信息:System.UnauthorizedAccessException:拒绝访问路径'blablabla'。

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

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

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

任何想法如何解决这个问题? ;)

感谢您的帮助。

祝福, 皮特。

1 个答案:

答案 0 :(得分:5)

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

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

 service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);

同样工作得很好,因为它实际上改变了服务的状态(它只是Windows Services列表中的一个更改),但礼貌地关闭使用某些服务的所有线程需要一些时间:)

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