【问题标题】:Best way to make sure a Service Process is stopped and its assemblies have been released?确保服务进程停止并释放其程序集的最佳方法是什么?
【发布时间】:2021-09-01 19:50:48
【问题描述】:

我有一个可以自动更新的服务。它通过下载并运行安装程序/更新程序来实现,这是另一个可执行文件。该可执行文件使用ServiceController 类停止服务,确保使用WaitForStatus(ServiceControllerStatus.Stopped) 停止服务,然后复制相关文件。这些文件包括服务的主程序集及其依赖项。

有时,安装按预期工作,但有时,我收到 IOException 告诉我它无法访问服务的程序集,因为它正在被另一个进程使用(可能是尚未完全关闭的服务)。为了解决这个问题,我尝试在WaitForStatus 调用之后添加一个相当大的延迟1000ms,然后再开始复制文件,但IOException 仍然随机抛出(或不抛出),即有时更新成功并且有时不是。

然后我尝试在我的服务的ServiceBase.OnStop 实现结束时添加对Environment.Exit() 的调用,并且更新似乎现在一直有效。但是,我可以说这不是好的做法,因为当我尝试从 SCM 停止我的服务时,它会停止,但会给出错误 Service process closed unexpectedly

那么做我想做的事情的最佳方法是什么?我可以增加延迟,但在我看来1000ms 应该有足够的时间让服务正确关闭并释放其对程序集的锁定。也许我做错了其他事情。

【问题讨论】:

    标签: c# .net service


    【解决方案1】:

    我将写下我为解决这个问题所做的工作。我这样做是为了当由于该异常而无法复制文件时,该进程进入一个循环,等待1000ms 并尝试再次复制该文件。它这样做了 5 次,如果 5 次后无法复制文件,则安装程序失败。实际上,从我收到的日志信息来看,服务进程最多可能需要 3 秒才能正确关闭。我认为这是解决我的问题的最佳方法。

    【讨论】:

      猜你喜欢
      • 2021-01-17
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      • 2011-06-04
      • 2015-04-17
      • 1970-01-01
      相关资源
      最近更新 更多