无法手动启动C#Windows服务

时间:2016-01-19 22:26:19

标签: c# windows-services

我已经在Windows 10笔记本电脑上的Visual Studio Community 2015中创建了一个Windows服务项目(从Windows 7升级并完全更新),但我无法手动成功启动我的服务,而且我无法强行杀死服务一旦开始。当我尝试通过服务控制台(services.msc)启动我的服务时,我得到以下行为:

  
      
  1. 弹出一个“服务控制”对话框,其中包含一个进度条。
  2.   
  3. 进度条在90秒内缓慢填充。
  4.   
  5. 当进度条已满时,我收到错误1053。
  6.   
  7. 服务状态更改为“正在启动”(开始待处理)并保持无限状态。
  8.   
  9. 除了强制重启之外,无法通过任何方式停止服务。
  10.   

我已经明白错误1053是30秒后无法启动的服务的结果。但是,我的服务不可能花费超过30秒的时间来启动。我的OnStartOnStopOnTimer方法目前如下:

protected override void OnStart(string[] args)
{
    System.Timers.Timer timer = new System.Timers.Timer();
    timer.Interval = 10000;
    timer.Elapsed += new System.Timers.ElapsedEventHandler(this.OnTimer);
    timer.Start();
}

protected override void OnStop()
{
}

public void OnTimer(object sender, System.Timers.ElapsedEventArgs args)
{
}

我的Main方法看起来像这样:

static void Main()
{
    ServiceBase[] ServicesToRun;
    ServicesToRun = new ServiceBase[]
    {
        new MyNewService()
    };
    ServiceBase.Run(ServicesToRun);
}

奇怪的是,如果我的服务的启动方法设置为“自动”,那么该服务将在下次Windows重新启动时自行启动。当它自动启动时,我可以手动停止服务(这是它唯一一次手动停止)。但是,在手动成功停止后,我仍然无法手动重新启动它。尝试这样做产生与前面描述的完全相同的行为,再次导致错误1053。

我的服务安装没有错误(通过installutil),我可以毫无错误地卸载。但是,如果我在服务停留在“正在启动”(Start Pending)模式时尝试卸载我的服务(通过installutil / u),则服务不会停止,仍为“正在启动”,启动模式将切换为“已禁用” ”。只有重新启动才能完全删除该服务。

我的问题: 为什么我的服务在Windows启动时自动启动,而不是通过任何其他手动方法启动? (我需要它自动启动,但也可以手动启动和停止它。)

感谢您的时间和专业知识。

2 个答案:

答案 0 :(得分:2)

问题是Avast反病毒以静默方式停止服务。令人讨厌的是,Avast不会将该服务报告为病毒或任何类型的威胁,也不会记录被阻止的服务。一旦我禁用了Avast,我就可以手动成功启动和停止我的服务。作为半永久性解决方案,我通过转到设置 - >将我的服务路径添加到Avast的例外列表中。主动保护 - >自定义(文件系统屏蔽) - >排除,然后点击“添加”。

要回答我的原始问题,我的服务能够在Windows启动时自动启动,因为它能够在加载Avast之前启动。这导致了我观察到的奇怪的行为,我可以在它自动启动后停止它,但不会手动重启它,因为Avast现在正在运行。

答案 1 :(得分:1)

您在方法OnStop中使用清理服务。 您创建了timer并且永远不会停止它。

private System.Timers.Timer timer;

protected override void OnStart(string[] args)
{
    timer = new System.Timers.Timer();
    timer.Interval = 10000;
    timer.Elapsed += new System.Timers.ElapsedEventHandler(this.OnTimer);
    timer.Start();
}

protected override void OnStop()
{
    timer.Stop();
    timer = null;
}