共计 3310 个字符,预计需要花费 9 分钟才能阅读完成。
本文首发于码友网 – 一个专注.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. 设置服务的退出代码。
示例代码托管和下载
本示例代码托管地址可以在原出处找到:示例代码下载地址