我很早以前就遇到过类似的windows服务问题,通过调用WaitForStatus(ServiceControllerStatus)
方法解决了。该服务需要一些时间来关闭,并且您在服务完全停止之前继续。Shutdown
编写卸载逻辑以及当状态停止时您想做的任何事情。
如果您正在卸载并且想要在卸载之前停止服务,那么您需要覆盖卸载自定义操作,添加代码以停止它,然后调用base.Uninstall
. 请记住,WaitForStatus
15 秒的限制可能不足以让服务关闭,这取决于它的响应速度以及它在关闭时的作用。还要确保调用(或本例中Dispose()
的ServiceController
关闭),因为如果你不这样做,内部服务句柄将不会立即释放,如果它仍在使用中,则无法卸载服务。
MSDN 链接
这只是如何在 EventLogger 中实现和记录的示例:
public override void Uninstall(System.Collections.IDictionary savedState)
{
ServiceController controller = new ServiceController("My Service");
try
{
if (controller.Status == ServiceControllerStatus.Running | controller.Status == ServiceControllerStatus.Paused)
{
controller.Stop();
controller.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 0, 30));
controller.Close();
}
}
catch (Exception ex)
{
string source = "My Service Installer";
string log = "Application";
if (!EventLog.SourceExists(source))
{
EventLog.CreateEventSource(source, log);
}
EventLog eLog = new EventLog();
eLog.Source = source;
eLog.WriteEntry(string.Concat(@"The service could not be stopped. Please stop the service manually. Error: ", ex.Message), EventLogEntryType.Error);
}
finally
{
base.Uninstall(savedState);
}
}