如何检查锁是否在<;服务>;。在C#中卸载时执行exe?

如何检查锁是否在<;服务>;。在C#中卸载时执行exe?,c#,windows,service,locking,uninstallation,C#,Windows,Service,Locking,Uninstallation,当尝试卸载应用程序时,我们尝试首先停止服务并确保WaitForStatus报告成功。然后我们使用sc delete删除它们,但有时并非所有文件都从安装的文件夹中删除。我们可以手动删除这些文件,但几秒钟左右之后,其他电脑的情况也会有所不同。在这里,我们认为windows保留/锁定了一些文件(主要是service.exe),因此无法删除它们和所有其他相关文件 我们想要实现的是,在成功删除.exe之后,我们要检查(比如,在while循环中)锁是否仍然处于.exe状态,如果是,请休眠2秒,然后重新检查,

当尝试卸载应用程序时,我们尝试首先停止服务并确保WaitForStatus报告成功。然后我们使用
sc delete
删除它们,但有时并非所有文件都从安装的文件夹中删除。我们可以手动删除这些文件,但几秒钟左右之后,其他电脑的情况也会有所不同。在这里,我们认为windows保留/锁定了一些文件(主要是service.exe),因此无法删除它们和所有其他相关文件

我们想要实现的是,在成功删除
.exe
之后,我们要检查(比如,在while循环中)锁是否仍然处于
.exe
状态,如果是,请休眠2秒,然后重新检查,直到释放为止,然后继续卸载文件。这可能需要大约30秒,但由于每台电脑的时间不同,我们希望保持健壮,而不是随机等待。 如何检查文件(service.exe)是否已锁定?从我的研究中,我没有看到一个直接的解决方案。每个人都建议检查
file.Open(FileMode.Open,FileAccess.Read,FileShare.None)
。这似乎没有必要。有直接的解决办法吗

下面是我关于如何停止和删除服务的代码

try
{
   service= new ServiceController(serviceName);
   service.Stop();
   service.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 60));
   service.Refresh();
   if (service.Status == ServiceControllerStatus.Stopped)
   {
        //runs command with sc delete 'servicename'
        return RunCommand("cmd.exe", "/c sc delete \"" + serviceName + "\"");
   }
}
catch()
{
 ...
}

对于一些可能感兴趣的人,我们通过尝试删除while循环中的service.exe来解决这个问题,重新尝试,直到它被删除。在重试之前,我们先睡1秒钟。我们还应该限制重试次数,否则最终可能会冻结卸载。希望这对具有类似用例的人有所帮助

如果您打算安装新版本的服务,比如CI/CD管道,那么我的建议是不要卸载旧服务,而只是停止它,等待,然后从头开始安装。根据我的经验,卸载Windows服务可能会导致您遇到问题(原因不明),因为我实际上不需要卸载它,我只需停止现有服务,绕过Windows通常会执行的任何服务管理/卸载后机制进行安装。您可能还想在Windows service MSC应用程序中检查服务状态。如果它突然说“disabled”(?),那是因为它在下次Windows引导时被标记为删除。另一个不卸载的原因是,如果您只是想重新安装CI/CD管道,请参见Hanks MickyD!我们在使用安装程序和卸载程序方面取得了长足的进步。我想我们不想回去了。停下来等待(多久?)对我们没有帮助。当我们想要升级时,我们想要停止/删除服务,删除所有旧文件,然后安装新文件,但正如我提到的,即使服务停止,其资源似乎没有释放,因此无法删除相关文件。它并没有说禁用,但文件被锁定了一段时间。是的,我在CI/CD上经常遇到这个问题…我将观看这个空间,因为我也想知道如何解决这个问题。我唯一的另一个建议是继续使用
ServiceController
停止和监视服务,直到停止,然后说使用
Process
来监视实际进程何时出现在Windows任务列表中。这是因为服务控制管理器只需关闭服务报告的任何状态,即使服务/进程仍在运行,也完全有可能报告已停止。对于一些可能感兴趣的人,我们通过尝试删除while循环中的.exe来解决此问题,重新尝试,直到其被删除。在重试之前,我们先睡1秒钟。我们还应该限制重试次数,否则最终可能会冻结卸载。希望这对具有类似用例的人有所帮助。