.net Windows服务开发

本文详细介绍Windows服务的开发与部署

一、服务项目搭建

1.新建一个Windows服务项目

然后会自动打开我们所添加服务的设计模式。

在解决方案管理器中右键Service1.cs,重命名为MyServices.cs

点击“单击此处切换到代码视图”或者在解决方案资源管理器中展开MyService.cs,双击MyService进入服务代码视图。

2.定时任务服务的一般通用模版

一般来说服务用于执行一些定时任务。因此服务中常用到的代码就是定时器了,在MyService中添加定时业务代码,即,在OnStart中创建并启动定时器,这块代码可以作为定时任务服务的通用的处理模版。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.Timers;

namespace MyService
{
    public partial class MyService : ServiceBase
    {
        public MyService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            // TODO:  在此处添加代码以启动服务。
            var timer = new Timer(1000 * 60) { AutoReset = true, Enabled = true }; //间隔1分钟
            timer.Elapsed += timer_Elapsed;
            timer.Start();
        }

        protected override void OnStop()
        {
        }
        private static bool IsExec = false;//定义服务是否正在运行状态
        private void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            //执行定时任务
            var interval_time = Convert.ToInt32(ConfigurationManager.AppSettings["IntervalTime"] ?? "3");
            if (DateTime.Now.Minute % interval_time == 0 && !IsExec)//每隔3分钟执行一次
            //if (DateTime.Now.Hour==0 && DateTime.Now.Minute == 0 && !IsExec)//每天0点0分执行
            {
                try
                {
                    IsExec = true;
                    //你的业务代码
                    //DoSomething();
                }
                catch (Exception ex)
                {
                    //抛出错误或者打印日志,注意:如果catch到异常服务会卡住(因为IsExec值为true不再改变),可根据自己业务需要是否加finally处理
                    //LogHelper.Error("执行定时任务出错!" + ex.Message);
                }
                //finally
                //{
                //    //IsExec = false;
                //}
                IsExec = false;
            }
        }
    }
}

tips:如果定时任务的间隔为分钟,并不是每分钟的0秒去执行timer_Elapsed方法的,而是以启动服务时的时间为准。比如,间隔为1分钟,服务启动时为09:05:30,那么每次执行timer_Elapsed方法的时间都是每分钟的30秒,而不是0秒。

二、Windows服务的部署

1.定义服务的名称和描述,以及服务的运行账户

在服务的设计模式视图中“右键→添加安装程序”,会自动添加一个安装程序文件,名称为ProjectInstaller.cs

在ProjectInstaller.cs的设计视图中,serviceInstaller控制服务的名称描述等相关内容,serviceProcessInstaller控制服务运行的账户。

(1)serviceInstaller属性配置

右键serviceInstaller1→属性

我们需要重点关注的是这三个属性,

ServiceName:服务名称,简单来说就是服务在操作系统中的名称,即系统任务管理器中该服务的进程名称。

DisplayName:展示名称,说明见下图

Description:服务描述说明,说明见下图

DisplayName和Description

使用Win+R,输入services.msc,打开系统的服务管理器

一般来说ServiceName和DisplayName保持一致即可,可以加统一公司前缀,这样多个服务时便于查找。Description服务描述一定要写的,便于运维人员进行维护(没有描述的服务可能会被运维当初垃圾服务干掉)。

(2)serviceProcessInstaller属性配置

右键serviceProcessInstaller1→属性

我们需要重点关注的就一个Account属性,改属性默认值是User(这里是个坑,因为选择为User的服务在启动时需要输入账户用户名和密码),这里我们需要调整为LocalService即可。

2.服务的安装

windows服务的安装需要使用到InstallUtil.exe,这个文件路径如下,

InstallUtil.exe(x86)   C:\Windows\Microsoft.NET\Framework\v4.0.30319

InstallUtil.exe(x64)   C:\Windows\Microsoft.NET\Framework64\v4.0.30319

使用x86安装还是x64安装取决与项目配置,右键项目,选择属性

为方便期间,我们把项目对应的InstallUtil.exe拷贝到我们的项目中。

同理再新建两个2个bat文件用于安装和卸载服务,也拷贝到项目中去

Install.bat

%~dp0InstallUtil.exe %~dp0项目名称.exe
Net Start 服务名称
sc config 服务名称 start= auto
pause

Uninstall.bat

%~dp0InstallUtil /u %~dp0项目名称.exe
pause

项目名称:该WinService服务项目的名称

服务名称:是serviceInstaller1中配置的ServiceName

把这3个文件粘贴到项目中以后,选中,右键属性

复制到输出目录,选择始终复制。

右键项目,生成,然后到项目目录下的打开bin文件夹,根据生成方式,选择Debug/Release文件夹

将里边的内容拷贝到服务器。执行Install.bat即可进行安装

注意,win2008及以上系统,执行安装卸载bat需要管理员权限运行:即右键Install.bat/Uninstall.bat→以管理员身份运行。

猜你喜欢

转载自blog.csdn.net/shujudeliu/article/details/81237141