背景:
因为自己需要一个定时器任务的功能…主要是按时请求一个获得假日列表的接口地址,然后返回指定的值。
一开始是想着直接用web程序来完成,但是突然想到web程序并不是无时无刻的处于连接状态中,毕竟是以http作为请求方式,所以发现了可以一直运行在系统上的windows服务了

实现:
1.打开VS2015,选择文件->新建->项目。

2.在项目中找到【windows服务】项目,重新命名后点击确定。

3.在service1设计器中点击右键,选择查看代码,进入代码页面。

4.在代码编辑器中添加【OnStart】服务启动方法。
OnStart方法主要是当该服务运行时才调用的,一般用来设置计时器相关操作,比如先创建一个计时器对象,然后再设置其属性

 protected override void OnStart(string[] args)
        {
            EventLog.WriteEntry("start");
            WriteLog("MuServices服务启动");
            System.Timers.Timer t = new System.Timers.Timer();
            t.Interval = 1000 * 60;//设置间隔时间
            t.Elapsed += new System.Timers.ElapsedEventHandler(Timer);//到达时间的时候执行指定事件,其中Timer就是我指定要执行的事件
            t.AutoReset = true;//设置是执行一次(false)还是一直执行(true)
            t.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件
        }

5.继续在代码编辑器中添加【Timer】方法。

public void Timer(object source, System.Timers.ElapsedEventArgs e)
        {
            int intHour = e.SignalTime.Hour;
            int intMinute = e.SignalTime.Minute;
            int intSecond = e.SignalTime.Second;
            //每天10点时候定时执行任务
            if (intMinute == 10)
            {
                try
                {
                    System.Timers.Timer tt = (System.Timers.Timer)source;
                    tt.Enabled = false;

                    SendApiUrl("http://api.muops.com/api/holidayremind");//发送获得节日列表请求

                    tt.Enabled = true;
                }
                catch (Exception ex)
                {
                    WriteLog(ex.Message);
                }
            }
        }

6.继续在代码编辑器中添加需要定时执行的任务方法(也就是上面的SendAPIUrl()方法)

public void SendApiUrl(string url)
        {
            try
            {
                WebClient wc = new WebClient();
                WriteLog("Sending an HTTP:" + url);
                byte[] bResponse = wc.DownloadData(url);
            }
            catch (Exception ex)
            {
                WriteLog("error:" + ex.Message);
            }
        }

7.在代码编辑器中添加【WriteLog】书写日志的方法

public void WriteLog(string message)
        {
            StreamWriter dout = new StreamWriter(@"d:/" + "SendApiLog.txt" + "", true);
            dout.Write("事件:" + message + " 时间:" + System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            dout.WriteLine("");
            dout.Close();
        }

8.如果没有其他事件执行,就可以在代码编辑器中添加【OnStop】服务停止方法

protected override void OnStop()
        {
            WriteLog("MuApi服务停止");
            EventLog.WriteEntry("stop");
        }

接下来还没完哦,我们还得添加安装程序
1.在service1中的设计器中点击右键,选择【添加安装程序】。

2.在安装程序中选中【serviceProcessInstaller1】,查看其属性,将【Account】值改为【LocalSystem】。

3.在安装程序中选中【serviceInstaller1】,查看其属性,将【ServiceName】值改为你想要的服务名称。

最后一部就是启动服务了
1.选中项目,右键,生成项目。

2.然后在debug目录中找到生成的程序。

3.在目录【C:\Windows\Microsoft.NET\Framework】中找到程序对应的.net版本,然后在该版本的目录中找到【InstallUtil.exe】程序,并将该程序拷贝到我们项目中的Debug目录下。

4.找到命令提示符,以管理员身份运行。然后在dos里面输入命令【D:\Mu\MuServices\MuServices.exe D:\Mu\MuServices\InstallUtil.exe】,当然,这里需要将目录换成你自己程序所在的目录。

5.回车后,Windows服务就已经安装好了。在任务管理器的服务中就可以找到当初命名的服务名称的服务了。选中该服务点击右键,启动服务就完成了。程序会在你代码设定的时间做你设定的任务。
s

然后以及能看到自己所设定的日志文件记录的内容
_JO45M$0J8_QOE)NX1RWP9C

6.如果你需要暂停该服务或者需要更新服务的话,我们就得让他停止,很简单,在后面加个-u
p

如果你技术学的足够优秀的话,可以用WIndowsServices做服务端开发