【Window Service】关于Window Service的两三事
引言
Window Service通常用于寄宿WCF服务或者定时作业.下面记录一下它的用法.
创建
创建Window Service项目后,可以看到Program和Service1类.Program是程序的主入口,而Service1则是我们逻辑实现的主要地方 ,两个关键方法是OnStart和OnStop,用于实现服务启动和结束时的逻辑.
安装
在Service1类的设计界面上右击,选择添加安装程序,就可以完成了安装程序的创建.
Nlog
Window Service作为一个后台程序,发生了什么错误很难获取的信息的,所以需要做个日志记录.下面做个示例,每3秒输出日志记录.
1.打开NuGet程序包管理界面,输入Nlog搜索,安装其中的Nlog和Nlog Configuration,接着在NLog.config做下修改,如下
<target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log" layout="${longdate} ${uppercase:${level}} ${message}" /> <target xsi:type="Console" name="c" layout="[${longdate}][${level:uppercase=true}][${logger}]${message}${exception}" /> </targets> <rules <logger name="*" minlevel="Debug" writeTo="f,c" /> </rules>
2.在Service1中使用Timer和Nlog类,实现每3秒输出日志记录,如下
public partial class Service1 : ServiceBase { readonly Logger logger = LogManager.GetCurrentClassLogger(); readonly Timer timer=new Timer(); public Service1() { InitializeComponent(); } protected override void OnStart(string[] args) { timer.AutoReset = true; timer.Interval = 3000; //单位毫秒 timer.Elapsed+=timer_Elapsed; timer.Start(); } protected override void OnStop() { timer.Stop(); } private void timer_Elapsed(object sender, ElapsedEventArgs e) { logger.Info(DateTime.Now.ToShortTimeString()); } //下面两个方法是为了方便调试而创建 public void Start() { OnStart(null); } public void Stop() { OnStop(); } }
部署
下面是安装和卸载脚本,分别保存成Bat文件,放在程序的根目录就可以.
@echo 安装服务
set svc_file=%cd%\WindowsServiceDemo.exe
sc create Service1 binpath= "%svc_file%" displayName= "Service1" depend= tcpip start= auto
net start Service1
@pause
@exit
@echo 卸载服务
net stop Service1
sc delete Service1
@pause
@exit
调试
VS貌似没有提供给Window Service调试的工具,要测试只能通过实际部署才能看到效果,但是可以利用TopShell寄宿服务来达到调试的目的.
1. http://topshelf-project.com/ 可以下到最新的类库
2.新建一个控制台程序,引用上面的服务,TopShell,Nlog,就可以编码了,如下
class Program { static void Main(string[] args) { HostFactory.Run(x => { x.UseNLog(); x.Service<Service1>(s => { s.ConstructUsing(name => new Service1()); s.WhenStarted(tc => tc.Start()); s.WhenStopped(tc => tc.Stop()); }); x.SetServiceName("Service1"); x.SetDisplayName("Service1"); x.SetDescription("每3秒记录日志"); x.RunAsLocalSystem(); x.StartAutomatically(); }); }
3.运行控制台程序,可以看到
小结
本文简单介绍了Window Service从创建到调试的步骤.如有更好的建议,请不吝指教.
参考资料