【发布时间】:2021-09-01 19:50:48
【问题描述】:
我有一个可以自动更新的服务。它通过下载并运行安装程序/更新程序来实现,这是另一个可执行文件。该可执行文件使用ServiceController 类停止服务,确保使用WaitForStatus(ServiceControllerStatus.Stopped) 停止服务,然后复制相关文件。这些文件包括服务的主程序集及其依赖项。
有时,安装按预期工作,但有时,我收到 IOException 告诉我它无法访问服务的程序集,因为它正在被另一个进程使用(可能是尚未完全关闭的服务)。为了解决这个问题,我尝试在WaitForStatus 调用之后添加一个相当大的延迟1000ms,然后再开始复制文件,但IOException 仍然随机抛出(或不抛出),即有时更新成功并且有时不是。
然后我尝试在我的服务的ServiceBase.OnStop 实现结束时添加对Environment.Exit() 的调用,并且更新似乎现在一直有效。但是,我可以说这不是好的做法,因为当我尝试从 SCM 停止我的服务时,它会停止,但会给出错误 Service process closed unexpectedly。
那么做我想做的事情的最佳方法是什么?我可以增加延迟,但在我看来1000ms 应该有足够的时间让服务正确关闭并释放其对程序集的锁定。也许我做错了其他事情。
【问题讨论】: