2009-08-21 80 views
6

我在写一个简单的Windows服务,每个月都会向所有员工发送电子邮件。我的问题是,如何在完成后自行停止?我是这个领域的noobie,所以请帮助我。非常感谢。如何以编程方式停止Windows服务?

它会在服务器上被部署为每月运行。我没有开始这件事,代码就这样给了我。它是用VB.NET编写的,现在我被要求改变一些东西。我注意到只有'Sub OnStart',并想知道服务何时会停止?主分支完成后,该服务的状态如何?它停下来还是挂在那里?对不起,正如我所说的,我对此很新....

回答

7

如果你有一个每月复发的任务,你最好先编写一个控制台应用程序,然后使用Windows Task Scheduler将它设置为每月运行一次。如果这是一个Win32服务(即使用C或C++编写),那么你只需调用SetServiceStatus()函数,就可以使用服务来处理需要长时间运行或不断用户登录的进程

+0

它将被部署在每月运行的服务器上。我没有开始这件事,代码就这样给了我。它是用VB.NET编写的,现在我被要求改变一些东西。我注意到只有'Sub OnStart',并想知道服务何时会停止?主分支完成后,该服务的状态如何?它停下来还是挂在那里?对不起,正如我所说的,我对这个真的很陌生...... – cplusplusNewbie 2009-08-21 15:17:36

+1

如果你是新手,那么这是一个让你自己看起来不错的好时机,并且用宏指令的方式向决策者提出建议。服务不是每月使用一次,而是连续的。对于您提到的情况,将代码从Windows服务中拖出并放入控制台应用程序非常简单。 – MattH 2009-08-25 15:19:27

3

SERVICE_STOPPED)并从ServiceMain返回。

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

0

它可能会更好写这一个计划任务,它肯定会更容易开始发展。那么它自然会终止,并且不会在本月其余时间消耗资源。

要回答原来的问题,你可以在C#中获取的当前运行服务的列表

services = System.ServiceProcess.ServiceController.GetServices(); 

然后寻找你想要的并置,以停止

locatedService.Status == ServiceControllerStatus.Stopped 

全部例如on msdn

0

净停止[SERVICE_NAME] ...在命令行上会做到这一点。

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

6

正如所有其他答案已经指出,这听起来像这应该是你运行一个计划任务的可执行文件或脚本。但是,如果您有义务以某种原因作为Windows服务运行并且您正在使用.NET,则只需在您的服务完成其工作后调用从ServiceBase继承的方法Stop()。从MSDN文档的方法:

Stop方法设置服务状态 指示停止已挂起, 调用调用OnStop方法。 应用程序停止后,服务 状态设置为停止状态。如果 应用程序是托管服务,则卸载应用程序域 。

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

一旦服务的OnStart方法完成,它会继续运行(什么都不做),直到事情告诉它停止在下列方式之一:

0

是否有一个原因,它已经是Windows服务?如果不是,请按照@Macros解决方案进行操作。但是,如果是这样,那么为什么要停止服务?如果你停止它,那么当需要发送电子邮件时,它将不得不重新启动。根据你的描述,这听起来不像需要大量资源,所以我建议安装它并让它运行,每月启动一次发送电子邮件。

0

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

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

表信息
  ProcessingStartTime
  CompletionDTE
  ...

数据库视图只翻出记录标记为非完成和过去有ProcessingStartTime。所以在服务确认事务之后,它会执行更新数据库记录的存储过程。对于这个系统,最终用户将excel文件上传到asp.net webfrom,将它们导入到数据库中。