Windows服务应用程序是一种需要长期运行的应用程序,它对于服务器环境特别适合。它没有用户界面,并且也不会产生任何可视输出。任何用户消息都会被写进Windows事件日志。计算机启动时,服务会自动开始运行。它们不要用户一定登录才运行,它们能在包括这个系统内的任何用户环境下运行。通过服务控 制管理器,Windows服务是可控的,可以终止、暂停及当需要时启动。最近项目中有这么一个需求,客户可以定时向服务器发送MQ实现特定业务操作。
让我们一起进入WinService的学习之旅吧~
.net创建Windows服务非常简单,创建一个项目,从面板中选择项目的类型为Windows服务,修改服务的名字为MyService,创建好的项目如图所示:
MyService继承自系统类System.ServiceProcess.ServiceBase,其中包含两个方法,OnStart(启动服务执行方法)和OnStop(停止服务执行方法)两个方法,查看MyService的代码如图所示:
Windows服务的启动程序入口=>Program.cs:
如果要启动多个服务,可以向ServicesToRun数组中增加多个Windows服务,比如新增Service2,Service3:
ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { new MyService() , new Service2(), new Service3() }; ServiceBase.Run(ServicesToRun);
接着可以自定义服务执行的业务逻辑,本服务模拟场景:每隔10分钟,从数据库获取现在时间到未来10分钟这段时间内,需要处理的某种业务(为了简单化=》向指定地址写入字符串和当前时间),业务逻辑代码如下所示:
namespace WinserviceDemo { public partial class MyService : ServiceBase { public MyService() { InitializeComponent(); } System.Timers.Timer timer1 = null; System.Timers.Timer timer2 = null; public List<DateTime> list = new List<DateTime>(); public DateTime nowTime; protected override void OnStart(string[] args) { timer1 = new System.Timers.Timer(); timer1.Start(); timer1.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Elapsed); timer1.Interval = 1000 * 60;//每隔一分钟 //timer2模拟了从数据库获取用户需要定时执行的操作时间点(此时间点 //与本服务无耦合关系) timer2 = new System.Timers.Timer(); timer2.Start(); timer2.Elapsed += new System.Timers.ElapsedEventHandler(timer2_Elapsed); timer2.Interval = 1000 * 60 * 10;//每隔十分钟 } public void timer2_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {//模拟从数据库获取数据,并且只获取当前时间到未来的10min段的数据 list.Clear(); list.Add(DateTime.Now.AddMinutes(9)); list.Add(DateTime.Now.AddMinutes(6)); list.Add(DateTime.Now.AddMinutes(4)); list.Add(DateTime.Now.AddMinutes(2)); list.Sort((x, y) => x.CompareTo(y)); } public void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { if (list.Count>0) { nowTime = DateTime.Now; if (list[0].Minute<=nowTime.Minute) { list.Remove(list[0]); writeFile(); } } } private void writeFile() { string filePath = "D:\\WinService\\test.txt"; StreamWriter sWrite = null; if (!File.Exists(filePath)) { sWrite = File.CreateText(filePath); } else { sWrite = File.AppendText(filePath); } sWrite.WriteLine("写入时间:" + DateTime.Now.ToString("yyyyMMdd HHmmss")); sWrite.Flush(); sWrite.Close(); } protected override void OnStop() { // } } }
编译通过后,开始部署安装程序:
1、将写好的Windows服务()切换到设计视图,右键》添加安装程序;
2、切换到新添加的 添加安装程序()的设计视图(包含两个:serviceInstaller1和serviceProcessInstaller1),设置serviceProcessInstaller1属性Account为LocalSystem;serviceInstaller1的属性ServiceName:MyService(服务的名字),StartType:Automatic(设置系统启动时服务自动启动)。
ServiceAccount是枚举类型,MSDN这样描述:http://msdn.microsoft.com/zh-cn/library/system.serviceprocess.serviceaccount(v=vs.80).aspx(包括使用示例)
3、接着新建一个安装项目(为当前服务添加安装项目),安装项目取名为MyServiceSetUp:
4、右键点击MyServiceSetUp=》添加=》项目输出,在弹出界面设置主项目输出为WinserviceDemo,点击确定;
5、右键》视图》自定义操作》安装(右键)》添加自定义操作》打开应用程序文件夹》选择上一步设置的主输出》确定;
6、右键》视图》自定义操作》卸载(右键)》添加自定义操作》打开应用程序文件夹》选择上一步设置的主输出》确定;
7、重新生成,在安装项目的Debug或Release问价加下可以找到安装程序,包含了所有的类库、组件,直接双击即可安装服务。
8、完成安装后,即可直接在服务管理器(右键我的电脑》管理》服务和应用程序》服务)中找到MyService服务,启动即可。