首先,请原谅我是一个小白,一直到前段时间才在工作需要的情况下写了第一个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。