首页 > 代码库 > 第一个任务--C# Windows服务(三)

第一个任务--C# Windows服务(三)

最后就剩下设定时间和部署项目了

我的服务进入系统的时候是自启动的,但是如果电脑打开以后这周不是周五那它根本就没有存在的意义,所以要写一个停止服务的方法:

/// <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,可以看到服务已经在跑了

再试试卸载:

恩,也蛮好的,是不是一下觉得厉害多了,哈哈,我自己倒觉得还不错。

总之这个小程序写到这里就算是告一段落了,以后如果有时间还会再改良一下,或者加入一些新的功能。