本文首发于: 码友网 -- 一个专注. NET/.NET Core 开发的编程爱好者社区.
文章目录
- C#/.NET 基于 Topshelf 创建 Windows 服务的系列文章目录:
- C#/.NET 基于 Topshelf 创建 Windows 服务程序及服务的安装和卸载 (1)
在 C#/.NET 应用程序开发中创建一个基于 Topshelf 的应用程序守护进程(服务) (2)
C#/.NET 基于 Topshelf 创建 Windows 服务的守护程序作为服务启动的客户端桌面程序不显示 UI 界面的问题分析和解决方案 (3)
前言
对于使用 Windows 操作系统的人来说, Windows Service(Windows 服务)应该不会陌生. 在 Windows 操作系统中, 我们可以在 "运行" 窗口中运行 service.msc:
即可打开一个查看 Windows 服务的窗口, 如图:
Windows 服务基本都是一些后台运行的服务进程, 没有 UI 界面, 每个服务处理着各自独立的任务并且有专门的启动或者停止策略. 所以, Windows 服务在很多情况下会被用来者处理一些定时任务或者调度.
那么, 对于. NET 的开发者来说, 可不可以自己创建 Windows 服务呢, 如何使用 C# 创建 Windows 服务呢?
本文就为大家分享一种基于 Topshelf 创建的 Windows 服务的方法.
创建 Topshelf 服务项目
首先打开 Visual Studio(本文使用的是 Visual Studio 2019), 打开新建项目的对话框, 选择. NET Framework 的控制台应用程序(Console App(.NET Framework)), 如图:
注: 只可选择控制台应用程序
点击 "下一步", 在项目名称中输入 TopshelfDemoService,.NET Framework 选择 4.6.2, 其中选项根据自己情况填写即可, 最后点击 "创建" 按钮.
安装 Topshelf 组件
在 TopshelfDemoService 项目中, 打开 Nuget 包管理工具, 搜索 Topshelf, 在搜索结果中选中 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 服务安装和卸载
我们刚才运行的只是一个控制台应用程序, 如果将这个控制台应用程序关掉, 定时任务也会被停止了. 如果我们希望定时任务可以一直运行, 那需要将这个控制台应用程序作为服务安装到 Windows 服务进程中, 如何操作呢?
非常简单的安装和卸载命令.
首先, 以管理员身份打开一个命令行工具, 进入到控制台应用程序所在目录.
安装
安装服务运行如下命令:
TopshelfDemoService.exe install
打开 Windows 服务查看窗口(刷新), 可以看到 Topshelf demo service 已经在服务列表中了, 如图:
这时, 我们只需要按照 Windows 服务来操作这个服务即可.
卸载
如果需要卸载服务, 则运行如下命令:
TopshelfDemoService.exe uninstall
Topshelf 配置参数说明
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