博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用Topshelf创建Windows服务
阅读量:7228 次
发布时间:2019-06-29

本文共 5965 字,大约阅读时间需要 19 分钟。

概述

Topshelf是创建Windows服务的另一种方法,老外的一篇文章通过5个步骤详细的介绍使用使用Topshelf创建Windows 服务。是一个开源的跨平台的宿主服务框架,支持Windows和Mono,只需要几行代码就可以构建一个很方便使用的服务宿主。

引用安装

1、官网: 这里面有详细的文档及下载

2、Topshelf的代码托管在 ,可以在这里下载到最新的代码。

3、新建一个项目,只需要引用Topshelf.dll 即可,为了日志输出显示,建议也同时引用Topshelf.Log4Net。程序安装命令

  • Install-Package Topshelf
  • Install-Package Topshelf.Log4Net

使用

官网文档给过来的例子非常简单,直接使用即可以跑起来,官网文档地址:

public class TownCrier{    readonly Timer _timer;    public TownCrier()    {        _timer = new Timer(1000) {AutoReset = true};        _timer.Elapsed += (sender, eventArgs) => Console.WriteLine("It is {0} and all is well", DateTime.Now);    }    public void Start() { _timer.Start(); }    public void Stop() { _timer.Stop(); }}public class Program{    public static void Main()    {        HostFactory.Run(x =>                                 //1        {            x.Service
(s => //2 { s.ConstructUsing(name=> new TownCrier()); //3 s.WhenStarted(tc => tc.Start()); //4 s.WhenStopped(tc => tc.Stop()); //5 }); x.RunAsLocalSystem(); //6 x.SetDescription("Sample Topshelf Host"); //7 x.SetDisplayName("Stuff"); //8 x.SetServiceName("Stuff"); //9 }); //10 }}

程序跑起来后,每隔一秒钟有输出,看到的效果如下:

配置运行

没错,整个程序已经开发完了,接下来,只需要简单配置一下,即可以当服务来使用了。安装很方便:

安装:TopshelfDemo.exe install
启动:TopshelfDemo.exe start
卸载:TopshelfDemo.exe uninstall

安装成功后,接下来,我们就可以看到服务里多了一个服务:

扩展说明

Topshelf Configuration 简单配置

官方文档,对HostFactory 里面的参数做了详细的说明: ,下面只对一些常用的方法进行简单的解释:

我们将上面的程序代码改一下:

HostFactory.Run(x =>                                 //1            {                x.Service
(s => //2 { s.ConstructUsing(name => new TownCrier()); //配置一个完全定制的服务,对Topshelf没有依赖关系。常用的方式。             //the start and stop methods for the service                     s.WhenStarted(tc => tc.Start()); //4 s.WhenStopped(tc => tc.Stop()); //5 }); x.RunAsLocalSystem(); // 服务使用NETWORK_SERVICE内置帐户运行。身份标识,有好几种方式,如:x.RunAs("username", "password"); x.RunAsPrompt(); x.RunAsNetworkService(); 等 x.SetDescription("Sample Topshelf Host服务的描述"); //安装服务后,服务的描述 x.SetDisplayName("Stuff显示名称"); //显示名称 x.SetServiceName("Stuff服务名称"); //服务名称 });

重装安装运行后:

 通过上面,相信大家都很清楚 SetDescription、SetDisplayName、SetServiceName区别。不再细说。

Service Configuration 服务配置

Topself的服务一般有主要有两种使用模式。

一、简单模式。继承ServiceControl接口,实现该接口即可。

实例:

namespace TopshelfDemo{    public class TownCrier : ServiceControl    {        private Timer _timer = null;        readonly ILog _log = LogManager.GetLogger(typeof(TownCrier));        public TownCrier()        {            _timer = new Timer(1000) { AutoReset = true };            _timer.Elapsed += (sender, eventArgs) => _log.Info(DateTime.Now);        }        public bool Start(HostControl hostControl)        {            _log.Info("TopshelfDemo is Started");            _timer.Start();            return true;        }        public bool Stop(HostControl hostControl)        {            throw new NotImplementedException();        }    }    class Program    {        public static void Main(string[] args)        {            var logCfg = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config");            XmlConfigurator.ConfigureAndWatch(logCfg);            HostFactory.Run(x =>            {                x.Service
(); x.RunAsLocalSystem(); x.SetDescription("Sample Topshelf Host服务的描述"); x.SetDisplayName("Stuff显示名称"); x.SetServiceName("Stuff服务名称"); }); } }}

二、常用模式。

实例:

namespace TopshelfDemo{    public class TownCrier    {        private Timer _timer = null;        readonly ILog _log = LogManager.GetLogger(                                         typeof(TownCrier));        public TownCrier()        {            _timer = new Timer(1000) { AutoReset = true };            _timer.Elapsed += (sender, eventArgs) => _log.Info(DateTime.Now);        }        public void Start(){ _timer.Start();}        public void Stop() { _timer.Stop(); }    }    class Program    {        public static void Main(string[] args)        {            var logCfg = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config");            XmlConfigurator.ConfigureAndWatch(logCfg);            HostFactory.Run(x =>            {                x.Service
(s => { s.ConstructUsing(name => new TownCrier()); s.WhenStarted(tc => tc.Start()); s.WhenStopped(tc => tc.Stop()); }); x.RunAsLocalSystem(); x.SetDescription("Sample Topshelf Host服务的描述"); x.SetDisplayName("Stuff显示名称"); x.SetServiceName("Stuff服务名称"); }); } }}

两种方式,都使用了Log4Net,相关配置:

 推荐使用第二种常用模式。

源代码下载:

下一篇,将介绍:Topself与Quartz.net的结合使用,结合起来使用,真是一个很完美的后台作业调试服务。

 

转载地址:http://gydfm.baihongyu.com/

你可能感兴趣的文章
十年IT运维谈(五):要专业化还是平台化?
查看>>
分享超级给力的一个外发光Shader
查看>>
oblog_4.6_SQL 语句
查看>>
通过Git WebHooks+脚本实现自动更新发布代码之shell脚本
查看>>
对象实例化、字符串的使用方法
查看>>
keepalived基于LVS实现高可用,实现web服务的高可用
查看>>
80端口被Microsoft-HTTPAPI/2.0占用的解决办法
查看>>
无法抗拒Minecraft给予超高的自由度和探索-微访谈
查看>>
数据结构之串
查看>>
我的友情链接
查看>>
lvs+keepalived+nginx+tomcat高可用高性能集群部署
查看>>
实验:搭建主DNS服务器
查看>>
org.gjt.mm.mysql.Driver与com.mysql.jdbc.Driver区别
查看>>
部署exchange2010三合一:之五:功能测试
查看>>
nginx编译安装参数
查看>>
代码托管
查看>>
第一次给ThinkPHP5核心框架提pull request的完整过程
查看>>
U-Mail邮件系统何以誉为信息整合中转枢纽
查看>>
强大的vim配置文件,让编程更随意
查看>>
崛起于Springboot2.X之配置文件详解(10)
查看>>