.net开发
一、服务项目搭建
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作***一定要固定ip 最近测试一个remote方案的,中心点adsl用ns拨出,远程remote8配合动态域名软件(推荐
今天,小近的朋友圈被一篇文章刷了屏,名字叫做《广告的世界里,根本没有什么甲方乙方》。小近看完后不禁惊呼,程序开发者的世界,不也是如