rambo

Windows服务

实现一个邮件自动发送的功能,采用Windows服务较为简便,就开发过程及其相关知识做下简要介绍并记录。

一 .Windows服务程序是在Windows操作系统下能完成特定功能的可执行的应用程序。Windows服务程序虽然是可执行的,但是它不像一般的可执行文件通过双击就能运行,它必须有特定的启动方式。这些启动方式包括了自动启动和手动启动两种。

具体概念参考:http://blog.csdn.net/yysyangyangyangshan/article/details/7295739

控制面板-〉管理工具-〉服务,图中Service1正是我自己创建的一个Windows服务。

fuwu

二.创建Windows服务程序:

.Net框架大大地简化了Windows服务程序的创建和控制过程,这要归功于其命名空间中的功能强大的类库。和Windows服务程序相关的命名空间涉及到以下两个:System.ServiceProcess和System.Diagnostics。其中ServiceBase类定义了一些可被其子类重载的函数,通过这些重载的函数,服务控制管理器就可以控制该Windows服务程序。这些函数包括:OnStart(),OnStop(),OnPause(),以及OnContinue(),等四个。而且ServiceBase类的子类还可以重载OnCustomCommand()函数来完成一些特定的操作。通过重载以上的一些函数,就完成了一个Windows服务程序的基本框架。

leiku

要使得一个Windows服务程序能够正常运行,我们需要像创建一般应用程序那样为它创建一个程序的入口点。在Windows服务程序中,我们也是在Main()函数中完成这个操作的。首先我们在Main()函数中创建一个Windows服务的实例,该实例应该是ServiceBase类的某个子类的对象,然后我们调用由基类ServiceBase类定义的一个Run()方法。然而Run()方法并不就开始了Windows服务程序,我们必须通过前面提到的服务控制管理器调用特定的控制功能来完成Windows服务程序的启动,也就是要等到该对象的OnStart()方法被调用时服务才真正开始运行。如果你想在一个Windows服务程序中同时启动多个服务,那么只要在Main()函数中定义多个ServiceBae类的子类的实例对象就可以了,方法就是创建一个ServiceBase类的数组对象,使得其中的每个对象对应于某个我们已预先定义好的服务。

在Service1.Designer.cs中添加Timer,注意:C#中有关定时器类有三个:

1)定义在System.Windows.Forms里,应用于WinForm中,通过Windows消息机制实现的,类似于VB或Delphi中的Timer控件,内部使用API SetTimer实现的。缺点:计时不精确,而且必须有消息循环,Console  Application(控制台应用程序)无法使用。
2)定义在System.Threading.Timer类,通过.NET  Thread  Pool实现的,轻量,计时精确,对应用程序、消息没有特别的要求。
3)定义在System.Timers.Timer类里 ,同上。可以应用于WinForm,但不支持手动拖放,需要编码实现。本文采用这种实现方式。

同时在初始化函数中添加Timer的相关属性。

 三.注册及删除服务:

会提示安装成功;这时候在服务里面就可以找到Service1的服务,启动服务后就开始运行程序了;如果你想调式,可以在vs里调式-附加到进程。