【问题标题】:c# Unable to stop windows servicec#无法停止windows服务
【发布时间】:2014-06-05 09:30:47
【问题描述】:

我有一个在OnStart(string[] args) 上触发线程的 Windows 服务。该主线程还创建了其他线程。安装并启动服务后,当我尝试停止服务时,我无法在第一次尝试时停止服务。当我右键单击我的服务并请求“停止”时。我得到以下异常并且服务仍在运行。

Windows 无法停止本地计算机上的服务。服务没有返回错误。这可能是内部 Windows 错误或内部服务错误。 如果问题仍然存在,请联系您的系统管理员。

当我再次尝试停止它时,我最终会收到其他消息

Windows 无法停止本地计算机上的服务。
错误 1061:服务目前无法接受控制消息。

但服务已停止。所以我正在执行右键单击->停止,两次停止服务。

我尝试如下中止线程并停止服务,但没有任何收获。

protected override void OnStop()
{
    onStartThread.Abort();
    Log.AuditEventLogger("Service Stopped");
    this.Stop();
}

我非常感谢任何建议。谢谢。

【问题讨论】:

  • 出于兴趣,你如何开始你的话题?是后台线程吗?如果没有,您可能需要制作一个 - msdn.microsoft.com/en-us/library/…
  • 看看这个问题是否对你有帮助:stackoverflow.com/questions/4885080/…
  • 受保护的覆盖 void OnStart(string[] args) { onStartThread = new Thread(() => DataFeedScheduler.Start()); onStartThread.Priority = ThreadPriority.Normal; onStartThread.Start();}

标签: c# multithreading windows-services


【解决方案1】:

首先,您正在调用this.Stop,然后它将再次调用您的OnStop 方法。您有一个无限循环,因此您的服务不会停止。

其次,不要像这样中止线程。让他们停下来的信号,例如使用等待句柄 (ManualResetEvent) 并加入线程。如果您正在使用任务,请使用CancellationToken。

【讨论】:

  • 这正是我做错的。我试过 ServiceController stop 和 this.Stop,两者都不起作用。一旦我删除了 stop() 它按预期工作。谢谢。
【解决方案2】:

根据您在 cmets 中的代码 sn-p,我建议您将线程设为后台线程。默认情况下,我相信它将是一个前台线程,因此如果它很忙,将停止您的进程终止。

更多详情请参阅MSDN。

但是,由于您没有在问题中提供大量详细信息,因此很可能还有其他因素在起作用。

【讨论】:

    【解决方案3】:
    onStartThread.Abort(); 
    

    不一定总是中止线程。 当调用 Abort 方法来销毁线程时,公共语言运行时会引发 ThreadAbortException。无法保证线程将永远结束。如果要等到中止的线程结束,可以调用 Thread.Join 方法。 Join 是一个阻塞调用,直到线程真正停止执行才返回。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多