【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从创建到调试的步骤.如有更好的建议,请不吝指教.

参考资料

    C# 编写Windows Service(windows服务程序)

    使用Topshelf创建Windows 服务

    NLog文章系列——系列文章目录以及简要介绍

posted @ 2015-07-12 00:28  Caizl  阅读(435)  评论(0编辑  收藏  举报