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

时间:2009-08-21 15:04:59

标签: windows-services

我正在编写一个简单的Windows服务,每月向所有员工发送电子邮件。我的问题是,当它完成后如何阻止自己?我是这个领域的小伙子所以请帮助我。真的很感激。

它将部署在每月运行的服务器上。我没有开始这个事情,代码就像那样给了我。它是用VB.NET编写的,我现在被要求改变它的一些东西。我注意到只有'Sub OnStart'并且想知道服务什么时候停止?主要子程序完成后,这项服务的状态是什么?是停止还是只是挂在那里?对不起,正如我所说的,我对这个很新......

7 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:6)

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

但是,如果由于某种原因您有义务作为Windows服务运行并且您在.NET中工作,则只需在服务完成后调用从Stop()继承的ServiceBase方法这是工作。从该方法的MSDN文档:

  

Stop方法设置服务状态   表示停止正在等待和   调用OnStop方法。之后   应用程序已停止,该服务   state设置为停止。如果   应用程序是托管服务   应用程序域已卸载。

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

一旦服务的OnStart方法完成,它将继续运行(什么都不做),直到某些东西告诉它以下列方式之一停止:

答案 2 :(得分:3)

如果这是一个Win32服务(即用C或C ++编写),那么只需调用SetServiceStatus(SERVICE_STOPPED)并从ServiceMain返回。

另一方面,如果您每月只发送一次电子邮件,为什么要使用服务呢?使用Windows任务计划程序并运行普通应用程序或脚本。

答案 3 :(得分:0)

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

要回答原始问题,您可以在C#

中获取当前正在运行的服务的列表
services = System.ServiceProcess.ServiceController.GetServices();

然后寻找你想要的那个并将状态设置为停止

locatedService.Status == ServiceControllerStatus.Stopped

完整示例on msdn

答案 4 :(得分:0)

命令行上的

net stop [service_name] ...也会这样做。

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

答案 5 :(得分:0)

是否有理由成为Windows服务?如果没有,请关注@Macros解决方案。但是,如果确实如此,那为什么要停止服务呢?如果你停止它,那么只需要在需要发送电子邮件时重新启动它。根据你的描述,它听起来并不需要很多资源,所以我建议只安装它并让它运行,每个月发送一次以发送电子邮件。

答案 6 :(得分:0)

这就是我在类似情况下所做的事情。

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

表留言
        ProcessingStartTime
        CompletionDTE
        ...

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