我正在编写一个简单的Windows服务,每月向所有员工发送电子邮件。我的问题是,当它完成后如何阻止自己?我是这个领域的小伙子所以请帮助我。真的很感激。
它将部署在每月运行的服务器上。我没有开始这个事情,代码就像那样给了我。它是用VB.NET编写的,我现在被要求改变它的一些东西。我注意到只有'Sub OnStart'并且想知道服务什么时候停止?主要子程序完成后,这项服务的状态是什么?是停止还是只是挂在那里?对不起,正如我所说的,我对这个很新......
答案 0 :(得分:7)
如果您有一个每月重复的任务,您可能最好不要编写控制台应用程序,然后使用Windows Task Scheduler将其设置为每月运行一次。对于需要长时间运行或持续运行的进程,无论是否有用户登录,都应该使用服务
答案 1 :(得分:6)
正如其他所有答案所述,听起来这应该是您作为计划任务运行的可执行文件或脚本。
但是,如果由于某种原因您有义务作为Windows服务运行并且您在.NET中工作,则只需在服务完成后调用从Stop()
继承的ServiceBase
方法这是工作。从该方法的MSDN文档:
Stop方法设置服务状态 表示停止正在等待和 调用OnStop方法。之后 应用程序已停止,该服务 state设置为停止。如果 应用程序是托管服务 应用程序域已卸载。
这里有一个重要的警告:运行服务的用户帐户必须具有停止服务的权限(这是ServerFault的主题)。
一旦服务的OnStart
方法完成,它将继续运行(什么都不做),直到某些东西告诉它以下列方式之一停止:
Stop
以编程方式
在服务本身或从
外部流程using the method
Colin Gravill describes in his
answer。 答案 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,然后将其导入数据库。