【问题标题】:How to restart Windows service by itself C# [duplicate]如何自行重启Windows服务C# [重复]
【发布时间】:2015-04-10 11:34:35
【问题描述】:

我创建了一个服务,通过 MSMQ 向该服务发送命令。

现在我需要重新启动服务,但是当它到达停止命令时,它只会抛出错误,或者在执行此任务的服务停止时无法读取下一行。

我使用的代码是:

ServiceController service = new ServiceController(serviceName);
            try
            {
                int millisec1 = Environment.TickCount;
                TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
                ShutdownService(serviceName, timeoutMilliseconds);

                // count the rest of the timeout
                int millisec2 = Environment.TickCount;
                timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec2 - millisec1));

                service.Start();
                service.WaitForStatus(ServiceControllerStatus.Running, timeout);
            }
            catch (Exception ex)
            {
                s_log.Error(ex);
            }

如何在服务停止时自行重启服务,它不会执行下一行代码。

【问题讨论】:

  • 我只从这个链接中选择了这个代码。但是当我试图停止服务时,它会被释放,当我尝试访问服务对象时,它会再次抛出错误
  • 为什么需要重启服务?猜你做错了什么。
  • 它基于我系统中的一些影响我的服务的参数。所以当参数改变时,我需要我的服务来实现这些效果。

标签: c# windows-services


【解决方案1】:

右键单击服务并选择其属性,然后选择恢复选项卡。将服务设置为在第一次失败后重新启动。然后要重启服务,只需调用Environment.Exit(1),Windows 就会重启服务。

【讨论】:

  • 我认为 OP 应该尝试从不同的方向解决问题。与其不断关闭并重新启动服务,不如让服务持续运行,但给它一个 System.Timers.Timer _timer 成员。您可以将 _timer.Interval 设置为 Environment.TickCount 并将 ElapsedEventHandler 添加到 _timer.Elapsed。然后,您可以按照您在 Environment.TickCount 中设置的频率在 ElapsedEventHandler 中做任何您想做的事情,而不会试图让您的服务像疯狂的僵尸一样死去并复活!
  • 不,我的 Web 应用程序中有一个选项,它会触发一条消息到服务,然后它会从 MSMQ 中选择消息并初始化重启。发生的事情是它停止了服务,但它什么也不做
  • 首先,您应该应用“关注点分离”的原则。服务不应自行重新启动。我建议另一个服务读取 msmq 并使用 ServiceManager 类重新启动有问题的服务。
  • 是不是 - 一旦服务被标记为已停止,就不会读取服务内写入的任何代码?
  • 嗯,问题是你为什么要首先重启服务,除非它是为了部署新代码。但如果必须,我将有一个单独的服务来执行重启。
猜你喜欢
  • 2023-04-08
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-18
  • 2011-08-21
  • 1970-01-01
相关资源
最近更新 更多