Windows services 如何以编程方式停止Windows服务?

Windows services 如何以编程方式停止Windows服务?,windows-services,Windows Services,我正在编写一个简单的Windows服务,每月向所有员工发送电子邮件。我的问题是,当它完成时,如何停止自己?我在这个领域很在行,所以请帮帮我。非常感谢 它将部署在服务器上,每月运行一次。我没有启动这个东西,代码就是这样给我的。它是用VB.NET编写的,现在我被要求对它进行一些修改。我注意到只有“Sub-OnStart”,不知道服务何时停止?主sub完成后,该服务的状态如何?它是停下来还是挂在那里?对不起,正如我所说的,我对这个很陌生 如果您的任务每月重复一次,那么最好编写一个控制台应用程序,然后使

我正在编写一个简单的Windows服务,每月向所有员工发送电子邮件。我的问题是,当它完成时,如何停止自己?我在这个领域很在行,所以请帮帮我。非常感谢


它将部署在服务器上,每月运行一次。我没有启动这个东西,代码就是这样给我的。它是用VB.NET编写的,现在我被要求对它进行一些修改。我注意到只有“Sub-OnStart”,不知道服务何时停止?主sub完成后,该服务的状态如何?它是停下来还是挂在那里?对不起,正如我所说的,我对这个很陌生

如果您的任务每月重复一次,那么最好编写一个控制台应用程序,然后使用将其设置为每月运行一次。服务应用于需要长时间或持续运行的进程,无论用户是否登录

如果这是Win32服务(即用C或C++编写),则只需调用SetServiceStatus(service_STOPPED)并从ServiceMain返回即可


另一方面,如果你一个月只发送一次电子邮件,你为什么要使用这项服务呢?使用Windows任务计划程序并运行正常的应用程序或脚本。

将此任务作为计划任务编写可能会更好,最初开发肯定会更容易。然后它将自然终止,并且在本月剩余时间内不会消耗资源

要回答最初的问题,您可以在C中获得当前正在运行的服务的列表#

然后查找您想要的,并将状态设置为stopped

locatedService.Status == ServiceControllerStatus.Stopped

完整示例

命令行上的net stop[service\u name]…也可以执行此操作


但是,我同意其他人的看法;Windows任务计划程序似乎可以更好地满足您的需求。

正如其他答案所指出的,这听起来应该是一个可执行文件或脚本,您可以作为计划任务运行

但是,如果出于某种原因您必须作为Windows服务运行,并且您正在.NET中工作,那么您只需在服务完成工作后调用从
ServiceBase
继承的
Stop()
方法即可。从方法的MSDN文档中:

Stop方法设置服务状态 指示停止处于挂起状态,并且 调用OnStop方法。之后 应用程序已停止,服务将停止 状态设置为“已停止”。如果 应用程序是一个托管服务 应用程序域已卸载

这里有一个重要的警告:运行服务的用户帐户必须具有停止服务的权限(这是的主题)

一旦服务的
OnStart
方法完成,它将继续运行(不执行任何操作),直到有东西告诉它以以下方式之一停止:

  • 按编程方式,通过调用
    Stop
    在服务本身内或从 外部过程
  • 通过命令行
  • 通过windows计算机管理控制台的“服务”面板

    • 作为Windows服务有什么原因吗?如果没有,则遵循@Macros解决方案。但是,如果是这样,为什么要停止服务?如果你停止它,那么当需要发送电子邮件时,它就必须重新启动。根据您的描述,它听起来并不需要很多资源,因此我建议安装它并让它运行,每月启动一次发送电子邮件。

      以下是我在类似情况下所做的

      windows服务全天候运行并处理工作单元。它通过数据库视图获取工作单位。

      表消息
      处理开始时间
      完成日期



      数据库视图仅提取标记为not complete的记录,并且在过去具有ProcessingStartTime。因此,在服务确认事务后,它会执行一个存储过程来更新数据库记录。对于此系统,最终用户将excel文件上载到asp.net Web,然后将其导入数据库。

      它将部署在服务器上,每月运行一次。我没有启动这个东西,代码就是这样给我的。它是用VB.NET编写的,现在我被要求对它进行一些修改。我注意到只有“Sub-OnStart”,不知道服务何时停止?主sub完成后,该服务的状态如何?它是停下来还是挂在那里?对不起,正如我所说,我对这件事真的很陌生……如果你对这件事不熟悉,那么这是一个让自己看起来很好的好时机,并向决策者提出宏观建议。服务不是每月使用一次,而是连续的。对于您提到的情况,从windows服务中提取代码并将其放入控制台应用程序非常简单。
      locatedService.Status == ServiceControllerStatus.Stopped