标签:c style class blog code java
最后就剩下设定时间和部署项目了
我的服务进入系统的时候是自启动的,但是如果电脑打开以后这周不是周五那它根本就没有存在的意义,所以要写一个停止服务的方法:
/// <summary> /// 停止Windows服务 /// </summary> public static void StopmyService() { try { string m_ServiceName = "WeeklyReport"; ServiceController service = new ServiceController(m_ServiceName); if (service.Status != ServiceControllerStatus.Stopped && service.Status != ServiceControllerStatus.StopPending) //若该服务不是停用状态,才将其停止 { service.Stop(); } } catch (Exception E) { throw new Exception("服务无法停用"); } }
在Elapsed事件中写入:
private void TimeMachine_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { //初始1秒触发一次 if (DateTime.Now.DayOfWeek == DayOfWeek.Friday) { //如果判断服务打开的时间为14点之前,那么改为1小时触发一次 if (DateTime.Now.Hour < 14) { TimeMachine.Interval = 3600000D; } if (DateTime.Now.Hour == 14 && DateTime.Now.Minute >= 00 && DateTime.Now.Minute < 59) //14点之后改为30秒触发一次 { TimeMachine.Interval = 30000D; } //快到15点时,改为1秒触发一次 if (DateTime.Now.Hour == 14 && DateTime.Now.Minute == 59 && (DateTime.Now.Second >= 30 && DateTime.Now.Second < 60)) { TimeMachine.Interval = 1000D; } if (DateTime.Now.Hour == 15 && DateTime.Now.Minute == 0) { Interop.ShowMessageBox("今天,你交周报了吗? 恩?", "友情提示"); //停止 StopmyService(); } if (DateTime.Now.Hour > 15 || (DateTime.Now.Hour == 15 && DateTime.Now.Minute > 0)) //提醒以后自动停止服务 { StopmyService(); } } else { //如果不是周五,启动1秒后自动停止服务 StopmyService(); } }
这样写虽然有点折腾,但是我心里舒服...
虽然Timer耗不了什么性能,但是我也不愿意让它做太多无效的计数,另外我发现,就算服务停止了,弹出的窗口也不会关掉,这应该是系统自行发出的指令,跟服务无关,感叹大神的能力就是不一样。
现在程序写好了,把我生成好的服务还有最初做的两个“安装启动服务”和“卸载服务”的bat打包发给老大就能交差了。
但是我联系他,他却不睬我。妈蛋,什么领导,叫我做东西我做好了,你至少回应我一下吧,就算不说“让同事们都装上吧”,好歹说一句“蛮好的”,“不错”之类的话吧。
居然连一句话都没有,拿我当猴耍啊。唉,反正我也是为了练技术才来实习的,不计较那么多了。
之后又闲下来了,我就开始考虑这个服务能不能改进一下,我给别人一个压缩文件还得解压,然后双击bat...一般的电脑用户都不会知道什么是bat吧,看起来也不够档次啊,而且这个弊端也不少,例如服务的路径不能放到含有中文的目录下,不然bat文件可能取不到路径,再例如总需要用管理员权限运行,很容易忽略等等。
要是能把这个打包成一个安装程序多好, 像我们用过的软件那样,一路“下一步”,安装完成!感觉高端多了,而且安装完后服务自动安装启动,全自动一条龙啊有木有?!
然后我就去网上找到了一些关于安装项目的教程,还真有不少,具体的创建过程我就不说了,网上很多资料可查。
说几点关键的,第一,安装项目里比较主要的就两个东西,一个是文件系统,另一个是自定义操作。
文件系统就是确定你要安装的东西,自定义操作就是在不同的状况下要干的事
第二,在自定义操作里添加自定义操作“主输出来自(WeeklyReport)(活动)”(这是我的项目)这个之后,生成安装程序后就可以看到服务被安装上了,但是没启动,怎么让它在安装后自动启动呢?我们需要在解决方案中新添加一个类库“CustomAction”,然后在这个类库里也添加一个安装程序MyInstallerClassDll.cs,在里面添加如下代码:
public override void Commit(IDictionary savedState) { base.Commit(savedState); //Auot start service after the installation is completed ServiceController sc = new ServiceController("WeeklyReport"); if (sc.Status.Equals(ServiceControllerStatus.Stopped)) { sc.Start(); } }
把这个CustomAction也添加到文件系统中,再在自定义操作里添加它--“主输出来自(CustomAction)(活动)”。
注意尽量每个文件夹里都添加上这些项目输出,否则安装过程可能会报错。
好了,生成安装程序,我们现在运行一下:
OK,非常Nice,可以看到服务已经在跑了
再试试卸载:
恩,也蛮好的,是不是一下觉得厉害多了,哈哈,我自己倒觉得还不错。
总之这个小程序写到这里就算是告一段落了,以后如果有时间还会再改良一下,或者加入一些新的功能。
第一个任务--C# Windows服务(三),布布扣,bubuko.com
标签:c style class blog code java
原文地址:http://www.cnblogs.com/Chump-Monkey/p/3763569.html