本文首发于:码友网--一个专一.NET/.NET Core开发的编程爱好者社区。html
C#/.NET基于Topshelf建立Windows服务的系列文章目录:编程
对于使用Windows操做系统的人来讲,Windows Service(Windows服务)应该不会陌生。在Windows操做系统中,咱们能够在"运行"窗口中运行service.msc
:windows
便可打开一个查看Windows服务的窗口,如图:app
Windows服务基本都是一些后台运行的服务进程,没有UI界面,每一个服务处理着各自独立的任务而且有专门的启动或者中止策略。因此,Windows服务在不少状况下会被用来者处理一些定时任务或者调度。工具
那么,对于.NET的开发者来讲,可不能够本身建立Windows服务呢,如何使用C#建立Windows服务呢?ui
本文就为你们分享一种基于Topshelf建立的Windows服务的方法。spa
首先打开Visual Studio(本文使用的是Visual Studio 2019),打开新建项目的对话框,选择.NET Framework的控制台应用程序(Console App(.NET Framework)),如图:操作系统
注:只可选择控制台应用程序命令行
点击"下一步",在项目名称中输入TopshelfDemoService
,.NET Framework 选择4.6.2,其中选项根据本身状况填写便可,最后点击"建立"按钮。code
在TopshelfDemoService
项目中,打开Nuget包管理工具,搜索Topshelf
,在搜索结果中选中Topshelf
,点击"安装",如图:
Topshelf
组件安装完成后,咱们就能够开始编写服务的示例代码了。
首先,建立一个名为HealthMonitorService.cs
的类(其做用假设为定时监控某个系统的运行健康情况),在其中分别建立方法:Start()
和Stop()
以及一个定时器,让定时器定时执行检查系统健康情况的任务(这里模拟的每秒向控制台输出一条文本信息),完整的代码以下:
using System; using System.Timers; namespace TopshelfDemoService { internal class HealthMonitorService { private readonly Timer _timer; public HealthMonitorService() { _timer = new Timer(1000) { AutoReset = true }; _timer.Elapsed += (sender, eventArgs) => Console.WriteLine("执行系统健康检查任务,全部指标均正常。执行时间:{0}", DateTime.Now); } public void Start() { _timer.Start(); } public void Stop() { _timer.Stop(); } } }
再建立一个名为MyServiceConfigure.cs
的服务配置类,这个类主要用来配置Topshelf服务的各类运行参数,代码以下:
using System; using Topshelf; namespace TopshelfDemoService { internal class MyServiceConfigure { internal static void Configure() { var rc = HostFactory.Run(host => // 1 { host.Service<HealthMonitorService>(service => // 2 { service.ConstructUsing(() => new HealthMonitorService()); // 3 service.WhenStarted(s => s.Start()); // 4 service.WhenStopped(s => s.Stop()); // 5 }); host.RunAsLocalSystem(); // 6 host.EnableServiceRecovery(service => // 7 { service.RestartService(3); // 8 }); host.SetDescription("Windows service based on topshelf"); // 9 host.SetDisplayName("Topshelf demo service"); // 10 host.SetServiceName("TopshelfDemoService"); // 11 host.StartAutomaticallyDelayed(); // 12 }); var exitCode = (int)Convert.ChangeType(rc, rc.GetTypeCode()); // 13 Environment.ExitCode = exitCode; } } }
注:其中数字的含义请见本文末尾的解释。
最后,打开Program.cs
文件,开启Topshelf
服务,以下:
namespace TopshelfDemoService { class Program { static void Main(string[] args) { MyServiceConfigure.Configure(); } } }
好了,完成到这里,整个示例程序就写好了,按F5运行示例程序,你将看到以下相似的控制台信息:
能够看到,咱们建立的TopshelfDemoService
服务每秒向控制台打印了一条文本信息,这和咱们的预期是吻合的。
这样,咱们就成功建立了一个基于Topshelf
的Windows服务,固然,这也只是一个简单和示例服务程序,其中没有复杂的业务逻辑和配置等等。这些都等待你去发掘。
咱们刚才运行的只是一个控制台应用程序,若是将这个控制台应用程序关掉,定时任务也会被中止了。若是咱们但愿定时任务能够一直运行,那须要将这个控制台应用程序做为服务安装到Windows服务进程中,如何操做呢?
很是简单的安装和卸载命令。
首先,以管理员身份打开一个命令行工具,进入到控制台应用程序所在目录。
安装
安装服务运行以下命令:
TopshelfDemoService.exe install
打开Windows服务查看窗口(刷新),能够看到Topshelf demo service
已经在服务列表中了,如图:
这时,咱们只须要按照Windows服务来操做这个服务便可。
卸载
若是须要卸载服务,则运行以下命令:
TopshelfDemoService.exe uninstall
1.设置服务主机使用
HostFactory.Run()
来建立并运行一个Topshelft服务。 2.设置Topshelf
使用类型HealthMonitorService
做为服务类。 3.配置如何建立一个服务的实例,这里采用的是使用关键字new
来实例化一个HealthMonitorService
对象,你也可使用IoCp容器来实例化服务对象。 4.设置当服务启动时执行的操做。 5.设置当服务中止时执行的操做。 6.设置将服务以本地系统身份运行。 7.启动恢复服务模式(当服务意外中止后自动恢复)。 8.设置第一次自动恢复服务的延迟时间为3分钟。 9.设置Topshelf服务在Windows服务中的描述信息。 10.设置Topshelf服务在Windows服务中的显示名称。 11.设置Topshelf服务在Windows服务中的服务名称。 12.设置Topshelf服务随Windows启动时自动运行(延迟)。 13.设置服务的退出代码。
本示例代码托管地址能够在原出处找到:示例代码下载地址
原文出处:https://www.cnblogs.com/bobositlife/p/create-windows-service-with-topshelf-in-csharp-console-application.html