必威体育Betway必威体育官网
当前位置:首页 > IT技术

.net Windows服务开发

时间:2019-08-02 21:11:06来源:IT技术作者:seo实验室小编阅读:90次「手机版」
 

.net开发

本文详细介绍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→以管理员身份运行。

相关阅读

ASP.NET中使用UpdatePanel实现局部异步刷新方法和攻略

asp.net UpdatePanel实现异步局部刷新如有雷同,不胜荣欣,若转载,请注明鉴于最近项目需要,研究了一下UpdatePanel控件的使用方法,现总结

Android Studio菜鸟开发————RelativeLayout相对布

相对布局是通过相对定位的方式让控件出现在布局任意位置; 在相对布局中如果不指定控件摆放的位置,那么控件都会被默认放在Relative

Question Answering over Freebase with Multi-Column

一、概要   通过知识库回答自然语言问题是一个重要的具有挑战性的任务。大多数目前的系统依赖于手工特征和规则。本篇论文,我们

Netscreen ***问题汇总

  一、千万不要再说,netscreen作***一定要固定ip 最近测试一个remote方案的,中心点adsl用ns拨出,远程remote8配合动态域名软件(推荐

程序开发的世界里,根本没有什么甲方乙方

今天,小近的朋友圈被一篇文章刷了屏,名字叫做《广告的世界里,根本没有什么甲方乙方》。小近看完后不禁惊呼,程序开发者的世界,不也是如

分享到:

栏目导航

推荐阅读

热门阅读