2016-01-19 187 views
2

我已经在Visual Studio社区2015年在我的Windows 10的笔记本电脑中创建一个Windows服务项目(从Windows 7升级,全面更新),但我一直无法人工成功启动我的服务,一旦服务开始启动,我无法强制终止服务。当我尝试启动通过服务控制台(Services.msc)中我的服务,我得到了以下行为:无法手动启动C#Windows服务

  1. A“服务控制”对话框会弹出一个进度条。
  2. 进度条在90秒内缓慢填充。
  3. 当进度条已满时,我收到错误1053.
  4. 服务的状态更改为并且在“开始”(开始待定)时保持无限。
  5. 除了强制重启之外,服务不能以任何方式停止。

我已经明白,错误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重新启动时自行启动。当它自动启动时,我可以手动停止服务(这是唯一一次手动停止)。但是,手动成功停止后,我仍然无法手动重新启动它。尝试这样做产生完全相同的行为没有错误(通过installutil)前文所述,在错误再次导致1053

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

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

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

+0

显示OnStop方法 – BWA

+0

OnStop方法添加到原始文章,它是空的 – Chase

+0

你可以检查事件查看器,看看是否有任何错误被捕获? – Martin

回答

2

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

为了回答我原来的问题,我的服务能够在Windows启动时自动启动,因为它能够在Avast加载之前启动,这导致了我观察到的奇怪行为,在它之后我能够阻止它自动启动,但没有手动重新启动,因为Avast现在正在运行该点

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; 
} 
+0

已经尝试过,但它对行为没有影响。 – Chase

+0

@Chase然后显示'OnTimer'方法,也许在这里是错误的。 – BWA

+0

OnTimer也是空的。将添加到原始帖子。 – Chase