【问题标题】:Unable to Manually Start C# Windows Service无法手动启动 C# Windows 服务
【发布时间】:2016-01-19 22:26:19
【问题描述】:

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

  1. “服务控制”对话框会弹出一个进度条。
  2. 进度条在 90 秒内缓慢填充。
  3. 当进度条已满时,我收到错误 1053。
  4. 服务的状态变为并无限保持在“Starting”(开始挂起)。
  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 重新启动时自行启动。当它自动启动时,我可以手动停止服务(这是唯一一次手动停止)。但是,手动成功停止后,我仍然无法手动重新启动它。尝试这样做会产生与前面描述的完全相同的行为,再次导致错误 1053。

我的服务安装没有错误(通过 installutil),我可以卸载没有错误。但是,如果我在服务卡在“正在启动”(启动挂起)模式时尝试卸载我的服务(通过 installutil /u),则服务不会停止,保持为“正在启动”,并且启动模式切换到“已禁用” ”。只有在重新启动时,服务才会完全删除。

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

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

【问题讨论】:

  • OnStop 方法已添加到原始帖子中。它是空的。
  • 您可以检查事件查看器以查看是否在其中捕获了任何错误吗?
  • @Martin 已检查,但该程序不产生任何事件日志,并且从未到达任何允许我手动写入事件日志的代码行。它卡在“开始”阶段。

标签: c# windows-services


【解决方案1】:

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

为了回答我最初的问题,我的服务能够在 Windows 启动时自动启动,因为它能够在加载 Avast 之前启动。这导致了我观察到的奇怪行为,在它自动启动后我能够将其停止,但由于 Avast 现在正在运行,因此无法手动重新启动它。

【讨论】:

    【解决方案2】:

    您应该在方法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;
    }
    

    【讨论】:

    • 试过了,但对行为没有影响。
    • @Chase 然后显示OnTimer 方法,可能这里有问题。
    • OnTimer 也是空的。将添加到原始帖子中。
    • @Chase Strange,停止后timer 应该可以工作。您的服务没有停止,这是一个问题,但是为什么呢?
    猜你喜欢
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多