通过Visual Studio中的Windows Service模板,我么可以创建.NET Framework版本的Windows Service,网络上对此已有详细且丰富的各路教程。但在我们升级到.NET Core 3.1或.NET 6后(这里仅讨论两个LTS版本),情况发生了相当大的变化。我们需要根据新的Worker Service模板,基于BackgroundService这个类来创建最新版本的Windows Service。

某软的官方文档更新的很快,文档中列出的创建Windows Service的必要条件都已经是6.0或更新。那是不是说.NET Core 3.1就无法创建呢?答案当然不是。今天我们就稍作修改,创建3.1版本的Windows Service。

.NET Core 3.1作为LTS(Long-term support)版本,是存在大量基于该版本的生产项目的,有时候条件不允许立刻升级到VS2022和.NET 6.0。所以本篇我们将使用VS2019,首先找到Worker Service模板,如果我们仔细观察,会发现相较于传统的Windows,更多了Linux和macOS的支持。

点击两次Next按钮后,选择.NET Core 3.1版本创建工程。默认仅包含Program和Worker两个cs文件。接下来我们通过NuGet安装Microsoft.Extensions.Hosting.WindowsService包。最新的版本是6.0,且同时依赖6.0版的Microsoft.Extension.Hosting。这里我们有两个选择,第一是在NuGet界面的下拉框中,选择安装3.1.17版本的WindowsService包,保持和默认Hosting包的版本相同。第二是将两者都升级到最新的6.0版本。所幸.NET的向后兼容做的不错,在这里我选择升级。在完成后的简单测试中,无论是部署在.NET 6 Runtime或.NET Core 3.1 Runtime的机器上,均可正常工作。当前状态应该如下图所示。

此时我们可以开始创建业务类了,就是你想用Service干点啥,在本篇的示例中,我只想躺平……疫情期间,不要用眼过度和上头648充值抽卡,打游戏实在是极其健康的选择了。

  1. public class LieFlatService
  2. {
  3. public static int Count { get; set; }
  4. public string LieFlat()
  5. {
  6. return $"Lie flat and play PS4 & Switch... {++Count}";
  7. }
  8. }

接着我们通过继承自BackgrounService的Worker类来调用LieFlatService实现躺平。真的是啥也不干,就是每隔一秒宣告一下躺平。

  1. public class Worker : BackgroundService
  2. {
  3. private readonly ILogger<Worker> _logger;
  4. private readonly LieFlatService _lieFlatSrvice;
  5.  
  6. public Worker(LieFlatService lieFlatService, ILogger<Worker> logger)
  7. {
  8. _lieFlatSrvice = lieFlatService;
  9. _logger = logger;
  10. }
  11.  
  12. protected override async Task ExecuteAsync(CancellationToken stoppingToken)
  13. {
  14. while (!stoppingToken.IsCancellationRequested)
  15. {
  16. string message = _lieFlatSrvice.LieFlat();
  17. _logger.LogWarning(message);
  18. _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
  19. await Task.Delay(1000, stoppingToken);
  20. }
  21. }
  22. }

然后我们还要修改一下Program类,通过UseWindowsService扩展方法将我们这个Console程序配置成Windows Service类型。如果我们之前选择WindowsServices 3.1的包,这里就不能方便的设置SeviceName了,其他倒是没啥区别。在CreateHostBuilder方法中,记得注册Worker和LieFlatService供.NET内置的依赖注入(Dependency Injection)框架使用。

  1. public class Program
  2. {
  3. public static void Main(string[] args)
  4. {
  5. CreateHostBuilder(args)
  6. .UseWindowsService(o =>
  7. {
  8. o.ServiceName = "Lie Flat Service";
  9. })
  10. .Build()
  11. .Run();
  12. }
  13.  
  14. public static IHostBuilder CreateHostBuilder(string[] args) =>
  15. Host.CreateDefaultBuilder(args)
  16. .ConfigureServices((hostContext, services) =>
  17. {
  18. services.AddHostedService<Worker>();
  19. services.AddSingleton<LieFlatService>();
  20. });
  21. }

代码部分至此就全部完成了。相对于.NET Framework的Windows Service,调试起来要容易的多,就直接当成Console程序Debug就行了。部署的操作也很简单,首先在project文件上右键选择发布到文件夹。

通常默认的发布配置就可以了,点击发布按钮之后,会在项目的bin\Release\netcoreapp3.1\win-x64\publish\目录下生成如下文件。如果修改发布文件选择Self Contained,则可以脱离对部署环境是否安装.NET的依赖,缺点就是会生成一大堆文件。

我们可以将publish文件夹拷贝到想要的位置,然后用admin权限打开PowerShell,通过命令行来创建Windows Service。

  1. sc.exe create "Lie Flat Service" binpath="C:\Users\dell\Desktop\publish\NetCoreWorkerService.exe"

此时打开Services界面,将创建的Lie Flat Service启动。

再打开检查Event Viewer检查Windows Logs,就可以发现Lie Flat Service发出的躺平宣言了。

删除Windows Service需要通过stop和delete两个命令。

本篇我们介绍了如何在.NET Core 3.1(.NET 6.0也几乎相同)的环境下创建Windows Service。同时.NET 4.5.2, .NET 4.6和.NET 4.6.1将于2022年4月26日终止支持。升级吧同学们。

示例代码:

https://github.com/manupstairs/NetCoreWorkerService

manupstairs/WorkerServiceTest1 (gitee.com)

以下链接,是MS Learn上Windows开发的入门课程,单个课程三十分钟到60分钟不等,想要补充基础知识的同学点这里:

开始使用 Visual Studio 开发 Windows 10 应用

开发 Windows 10 应用程序

编写首个 Windows 10 应用

创建 Windows 10 应用的用户界面 (UI)

增强 Windows 10 应用的用户界面

在 Windows 10 应用中实现数据绑定

.NET 6学习笔记(2)——通过Worker Service创建Windows Service的更多相关文章

  1. Android学习笔记——Activity的启动和创建

    http://www.cnblogs.com/bastard/archive/2012/04/07/2436262.html Android Activity学习笔记——Activity的启动和创建 ...

  2. golang学习笔记5 用bee工具创建项目 bee工具简介

    golang学习笔记5 用bee工具创建项目 bee工具简介 Bee 工具的使用 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/instal ...

  3. WPF 学习笔记-在WPF下创建托盘图标

    原文:WPF 学习笔记-在WPF下创建托盘图标 首先需要在项目中引用System.Windows.Forms,System.Drawing; using System; using System.Co ...

  4. Linux学习笔记(7)CRT实现windows与linux的文件上传下载

    Linux学习笔记(7)CRT实现windows与linux的文件上传下载 按下Alt + p 进入SFTP模式,或者右击选项卡进入 命令介绍 help 显示该FTP提供所有的命令 lcd 改变本地上 ...

  5. C#创建Windows Service(Windows 服务)基础教程

    Windows Service这一块并不复杂,但是注意事项太多了,网上资料也很凌乱,偶尔自己写也会丢三落四的.所以本文也就产生了,本文不会写复杂的东西,完全以基础应用的需求来写,所以不会对Window ...

  6. 创建Windows Service

    基本参照使用C#创建Windows服务,添加了部分内容 目录 创建Windows Service 可视化管理Windows Service 调试 示例代码 创建Windows Service 选择C# ...

  7. C# 创建Windows Service(Windows服务)程序

    本文介绍了如何用C#创建.安装.启动.监控.卸载简单的Windows Service 的内容步骤和注意事项. 一.创建一个Windows Service 1)创建Windows Service项目 2 ...

  8. Android学习笔记(九)一个例子弄清Service与Activity通信

    上一篇博文主要整理了Service的创建.绑定过程,本篇主要整理一下Service与Activity的通信方式.包括在启动一个Service时向它传递数据.怎样改变运行中的Service中得数据和侦听 ...

  9. [Android学习笔记4]四大应用组件之一:Service 上

    一.什么是Service 一个Service就是一个能够在后台执行长时操作的应用程序组件,并且不提供用户界面.一个应用程序组件能够启动一个Service,即使用户切换到另一个应用程序,这个Servic ...

随机推荐

  1. Copy as Markdown - 将页面链接按照 Markdown 格式copy

    将页面文字和链接组成 Markdown 格式的网址 直接对页面链接右键使用时,无法获取链接标题,只能显示 No Title 所以需要: 选中「想作为标题的部分文字」, 然后去对「页面链接」右键-> ...

  2. MHA高可用配置及故障切换

    MHA高可用配置及故障切换 目录 MHA高可用配置及故障切换 一.案例概述 二.案例前置知识点 1. MHA概述 2. MHA的组成 (1)MHA Manager(管理节点) (2)MHA Node( ...

  3. 数组中包含多个对象 按照对象中的时间进行排序 适用与Angular.js、Jquery、微信小程序等

         LiveList.sort(this.compare('StartDate'))   //StartData:需要排序的时间   compare: function (property) { ...

  4. ROS::message_filters中的一个报错(mt::TimeStamp……)

    『方便检索』 ros::Time msg_time = mt::TimeStamp<typename mpl::at_c<Messages, i>::type>::value( ...

  5. 用maven创建项目引入js文件位置

    用maven创建项目引入js文件位置 截图如下:

  6. netty系列之:不用怀疑,netty中的ByteBuf就是比JAVA中的好用

    目录 简介 ByteBuf和ByteBuffer的可扩展性 不同的使用方法 性能上的不同 总结 简介 netty作为一个优秀的的NIO框架,被广泛应用于各种服务器和框架中.同样是NIO,netty所依 ...

  7. 私有化轻量级持续集成部署方案--03-部署web服务(下)

    提示:本系列笔记全部存在于 Github, 可以直接在 Github 查看全部笔记 配置接口代理 前后端分离情况下,前端请求后端接口最常用的一种方式就是使用反向代理,反向代理会让浏览器认为是同源路径, ...

  8. CentOS7下修改默认网卡名为eth0的方法

    1.修改网卡配置文件中的 DEVICE=参数的,关于eth0 [root@ansheng ~ ]# cd /etc/sysconfig/network-scripts/ [root@ansheng n ...

  9. Gradle进行Build 报GBK错误

    如上图,码主电脑windows,公司用的gradle进行项目build,本地进行build,总是出现这种GBK错误. 本身知道这是文件的编码问题:一般文件都是UTF-8编码,compilejava 默 ...

  10. json系列(一)cjson,rapidjson,yyjson解析示例

    前言 项目上通过消息中间件传输json格式的数据,其他接收模块需要对json格式的数据进行解析,反序列化.对json解析工具有几个关注点,一是具备解析和构造的基础功能,二是具备解析和构造的高性能,三是 ...