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

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

转自:http://www.cnblogs.com/jys509/p/4614975.html

概述

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的结合使用,结合起来使用,真是一个很完美的后台作业调试服务。

转载于:https://www.cnblogs.com/sheseido/p/5651047.html

你可能感兴趣的文章
clipse安装ADT插件重启后不显示Android SDK Manager和Android Vir
查看>>
理解TIME_WAIT,彻底弄清解决TCP: time wait bucket table overflow
查看>>
linux sudo 命令
查看>>
Redis与Memcached区别
查看>>
×××LAMP
查看>>
HTML5缓存
查看>>
我的友情链接
查看>>
linux 局域网防火墙
查看>>
Mysql分表和分区的区别、分库和分表区别
查看>>
关于tp-link wr740 v4的刷机救砖的办法(非线刷解决)恢复原版的
查看>>
我的友情链接
查看>>
获取http://www.89ip.cn/index_1.html网站的ip和端口的组合
查看>>
Docker上运行elasticsearch
查看>>
LAMP的的安装环境搭建
查看>>
Mac: brew
查看>>
添加删除路由
查看>>
linux 双网卡bond绑定
查看>>
Linux Shell脚本编程--Linux特殊符号大全
查看>>
微信小程序 - 创建第一个小程序
查看>>
我的友情链接
查看>>