新建第一个windows服务(Windows Service)

  首先,请原谅我是一个小白,一直到前段时间才在工作需要的情况下写了第一个windows服务。首先说一下为什么写这个windows服务吧,也就是什么需求要我来写这么一个东西。公司的项目中,需要一个预警功能(从数据库里取出需要的日期,在这个日期的前两天向相应的用户以短信的形式发出提醒)。因为不是一个日期,并且日期不是固定的。所以需要每一天都要在规定的时间向服务器发出请求,这需要后台自动执行的事件。我一直觉得这种功能很牛X的,就因为它们是自动执行的,哈哈。最后就用到了这么这个没有写过的windows服务。其实前面在做这个项目的时候,也遇到了类似的事情(小区居民回复物业系统发出的短信,比如短信投票),需要及时接受并且做出相应的回复或操作。为了解决这个问题我是做了一个定时器放在Global.asax文件里的。但是这中方法有个弊端,就是需要启动项目才能让计时器跑起来,而Windows Service就完美的解决了这个问题。只要在服务器上启动服务,不管项目是否运行,服务里的程序依然可以运行。啰啰嗦嗦的也不知道讲清楚没有,开始记录新建Windows Service的过程吧。

  因为是新建第一个Windows Service,所以很艰难,一个字——累!因为周围的同事、同学因为工作原因基本上都很少接触这个东西。首先百度了方法,在这里也详细记录下来,请原谅,因为我脑袋的内存小,怕以后不知道怎么做,只能详细的记录了。哦,我用的是asp.net。

1.首先创建一个空的解决方案,主要是记录windows服务,所以asp.net里面什么也没有操作

 

2.新建windows服务

 

3.在windows服务内编写程序,首先切换到Service1的代码视图,从代码中两个程序已经自动生成的两个方法名字可以看出,OnStart()为开始,OnStop()为结束。其实还有暂停OnPause(),继续OnContinue()两个方法。

 1 namespace WindowsService
 2 {
 3     public partial class Service1 : ServiceBase
 4     {
 5         public Service1()
 6         {
 7             InitializeComponent();
 8         }
 9 
10         //启动服务时执行
11         protected override void OnStart(string[] args)
12         {
13         }
14         //停止服务时执行
15         protected override void OnStop()
16         {
17         }
18     }
19 }

 

我把我的代码贴出来吧

 1 namespace WinService
 2 {
 3     public partial class Service1 : ServiceBase
 4     {
 5         public Service1()
 6         {
 7             InitializeComponent();
 8         }
 9 
10         System.Timers.Timer timer = new System.Timers.Timer();
11         common com = new common();
12         SMS sms = new SMS();
13         protected override void OnStart(string[] args)
14         {
15             timer.Enabled = true;
16             timer.Interval = 60000;//执行间隔时间,单位为毫秒    每分钟执行一次
17             timer.Start();
18             timer.Elapsed += new System.Timers.ElapsedEventHandler(Timer1_Elapsed);
19         }
20 
21         protected override void OnStop()
22         {
23             timer.Enabled = false;
24         }
25 
26         private void Timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
27         {
28             int intHour = e.SignalTime.Hour;    //获得当前的小时
29             int intMinute = e.SignalTime.Minute;    //获得当前的分钟
30             int intSecond = e.SignalTime.Second;    //获得当前的秒
31 
32             /*每分钟执行一次*/
33             //更新投票结束状态
34             com.updateVoteState();
35             //短信
36             sms.SMSVote();
37             /*每分钟执行一次*/
38 
39             // 每天的10:30执行这个方法
40             int iHour = 10;
41             int iMinute = 30;
42             if (intHour == iHour && intMinute == iMinute )
43             {
44                 //预警功能
45                 com.Warning();
46             }
47         }
48 
49     }
50 }

我在服务里面放了,每分钟执行的方法,有每天只需的方法。

4.要实现的功能都写好了,下面是添加服务的安装程序了。首先添加

在工具箱中找到serviceProcessInstaller和serviceInstaller,并添加到Installer.cs中

 

设置serviceInstaller

设置serviceProcessInstaller

 

5.前的都做好了,服务基本上就完成了,最后一步就是注册了。前边的在网上的各位大神的帮助下很顺利的完成了,就是在注册这里把我难到了,一直失败一直失败,弄到我都没有脾气了。百度新建windows服务,大部分后面的注册介绍的方法是这样的。
   (1)打开命令提示
 (2)输入installutil  C:\Users\win10\Documents\Visual Studio 2012\Projects\WindowsService\bin\Debug\WindowsService.exe(安装)。
          或者是 输入C:\Windows\Microsoft.NET\Framework\v4.0.30319(安装)

  这些方法好像在win7上可以安装成功,可是我安装的是win10的就悲催了,怎么都不能实现。最后还是一个同学做过,告诉了我一种方法

  (1)以管理员身份运行命令提示
  (2)输入sc create test binPath="C:\Users\win10\Documents\Visual Studio 2012\Projects\WindowsService\bin\Debug\WindowsService.exe"(注册)
    sc start test(启动)
    sc start test   (启动服务)
    sc stop test   (停止服务)
    sc delete test  (从注册表删除服务)

  另外,服务的名称不知道是不是必须是解决方面的名字哦,我用其它的好像都不行,没有认真的去试这个。不知道为什么百度新建windows服务是就是没有找到这种注册服务的方法,百度sc create是就都出现了,所以在注册这里把弄的很狼狈。  下面这样一段是我在百度百科上看到的,可以参考一下

  Sc create 是Windows DOS命令,用于创建Windows服务。适用于:Windows 7,Windows Server 2003,Windows Server 2003 R2, Windows Server 2003 with SP1, Windows Server 2003 with SP2,Windows Server 2008, Windows Server 2008 R2,Windows Vista。 

 

posted @ 2016-05-25 23:53  水上飘0901  阅读(5361)  评论(1编辑  收藏  举报