使用.NET Core创建Windows服务 - 使用.NET Core工作器方式
原文:Creating Windows Services In .NET Core – Part 3 – The “.NET Core Worker” Way
作者:Dotnet Core Tutorials
译者:Lamond Lu
译文:使用.NET Core创建Windows服务 - 使用.NET Core工作器方式
使用.NET Core创建Windows服务
安装步骤
这里首先你要确保你已经安装了.NET Core 3.0或以上版本。在我编写这篇文章的时候, .NET Core 3.1刚刚发布,Visual Studio应该会提示你升级到最新版本。但是如果你想要在.NET Core 2.x项目中使用这个方式,应该是行不通的。
如果你喜欢使用命令行创建项目,你就需要使用工作器(worker)类型创建项目:
dotnet new worker
如果你是一个和我一样喜欢使用Visual Studio的开发人员,那么你可以在Visual Studio中使用项目模板完成相同的功能。
这样做将创建出一个包含两个文件的项目。其中Program.cs
文件是应用的启动“引导程序”。另外一个文件是worker.cs
文件,在这个文件中,你可以编写你的服务逻辑。
这看起来应该是相当的容易,但是为这个程序添加额外的并行后台服务,你还需要添加一个类,并让它继承BackgroundService
类:
public class MyNewBackgroundWorker : BackgroundService
{
protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
//Do something.
}
}
然后在Program.cs
中,我们要做的只是把当前的Worker注册到服务集合(Service Collection)中即可。
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
services.AddHostedService<MyNewBackgroundWorker>();
});
实际上作为“后台服务”任务的运行程序,AddHostedService
方法已经在框架中存在了很长时间了。在之前我们已经完成的一篇关于ASP.NET Core托管服务的文章, 但是在当时场景中,我们托管是是整个应用,而非一个在你应用程序幕后运行的东西。
运行/调试我们的应用
在默认的工作器(worker)模板中,已经包含了一个后台服务,这个服务可以将当前时间输出到控制台窗口。下面让我们点击F5来运行程序,看看我们能得到什么。
info: CoreWorkerService.Worker[0]
Worker running at: 12/07/2019 08:20:30 +13:00
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
在我们启动程序之后,程序立刻就运行了!我们可以保持控制台的打开状态来调试应用,或者直接关闭窗口退出。相较于使用"Microsoft"方式来调试一个Windows服务,这简直就是天堂。
这里我们需要注意的另外一件事情是编写控制台程序的平台。在最后,我们不仅在控制台窗口输出了时间,还通过依赖注入创建了一个托管worker. 我们也可以使用依赖注入容器来注入仓储,配置环境变量,获取配置等。
但这里我们还没有做的事情是,将这个应用转换为Windows服务。。
将我们的应用转换成Window服务
为了将应用转换成Windows服务,我们需要使用如下命令引入一个包。
Install-Package Microsoft.Extensions.Hosting.WindowsServices
下一步,我们需要修改Program.cs
文件,添加UseWindowsService()
方法的调用。
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
})
.UseWindowsService();
以上就是所有需要变更的代码。
运行我们的程序,你会发现和之前的效果完全样。但是这里最大的区别是,我们可以将当前应用以Windows服务的形式安装了。
为了实现这一目的,我们需要发布当前项目。在当前项目目录中,我们可以运行以下命令:
dotnet publish -r win-x64 -c Release
然后我们就可以借助标准的Windows服务安装器来安装当前服务了。
sc create TestService BinPath=C:\full\path\to\publish\dir\WindowsServiceExample.exe
当前,你也可以使用Windows服务安装器的其他命令。
sc start TestService
sc stop TestService
sc delete TestService
最后检查一下我们的服务面板。
服务已经正常工作了。
在Linux中运行服务
老实说,我没有太多的Linux经验,但是终归是需要了解一下...
在Linux系统中, 如果你希望我们编写的“Windows”服务在Linux系统中作为服务运行,你需要做以下2步:
- 使用
Microsoft.Extensions.Hosting.Systemd
替换之前的Microsoft.Extensions.Hosting.WindowsServices
。 - 使用
UseSystemd()
替换UseWindowsService()
。
Microsoft vs Topshelf vs .NET Core Workers
到现在为止,我们已经介绍了借助3种不同的方式来创建Windows服务。
你可能会问“好吧,那我到底应该选择哪一种?”
这里呢,我们可以首先把"Microsoft"这种老派学院式的方式抛弃。以为它的调试实在是太麻烦了,而且没有什么实际的用处。
然后剩下的就是Topshelf
和.NET Core工作器两种方式了。在我看来,.NET Core工作器,已经很好的融入.NET Core生态系统,如果你正在开发ASP.NET Core应用,那么使用.NET Core工作器就很有意义。最重要的是,当你创建一个后台服务的时候,你可以让它在一个ASP.NET Core网站中的任意位置运行,这非常的方便。但是缺点是安装。你必须使用SC
命令来安装服务。这一部分Topshelf
可能更胜一筹。
Topshelf
总体上将非常的友好,并且具有最好的安装方式,但是使用额外的库,也增加了学习的成本。
所以Topshelf
和.NET Core工作器,大家可以自行选择,都是不错的方案。
使用.NET Core创建Windows服务 - 使用.NET Core工作器方式的更多相关文章
- 使用.NET Core创建Windows服务(二) - 使用Topshelf方式
原文:Creating Windows Services In .NET Core – Part 2 – The "Topshelf" Way 作者:Dotnet Core Tut ...
- .NET Core 创建Windows服务
.NET Core 创建Windows服务 作者:高堂 原文地址:https://www.cnblogs.com/gaotang/p/10850564.html 写在前面 使用 TopShelf+Au ...
- 使用.NET Core创建Windows服务(一) - 使用官方推荐方式
原文:使用.NET Core创建Windows服务(一) - 使用官方推荐方式 原文:Creating Windows Services In .NET Core – Part 1 – The &qu ...
- 使用.NET Core创建Windows服务详细步骤
目录 #创建步骤 1.使用Visual Studio创建 2.使用命令行创建 #项目结构说明 #将应用转换成Window服务 1.引入Microsoft.Extensions.Hosting.Wind ...
- 使用.NET Core中创建Windows服务(一) - 使用官方推荐方式
原文:Creating Windows Services In .NET Core – Part 1 – The "Microsoft" Way 作者:Dotnet Core Tu ...
- 使用.Net Core 2.2创建windows服务
使用.Net Core 2.2创建windows服务 我的环境 win 10 home Visual Studio 2019 v16.1.3 安装有.net core 2.2 创建项目 编辑项目文件 ...
- C#/.NET基于Topshelf创建Windows服务的守护程序作为服务启动的客户端桌面程序不显示UI界面的问题分析和解决方案
本文首发于:码友网--一个专注.NET/.NET Core开发的编程爱好者社区. 文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Topshelf ...
- 用C#创建Windows服务(Windows Services)
用C#创建Windows服务(Windows Services) 学习: 第一步:创建服务框架 创建一个新的 Windows 服务项目,可以从Visual C# 工程中选取 Windows 服务(W ...
- 玩转Windows服务系列——创建Windows服务
创建Windows服务的项目 新建项目->C++语言->ATL->ATL项目->服务(EXE) 这样就创建了一个Windows服务项目. 生成的解决方案包含两个项目:Servi ...
随机推荐
- 如何在HTML中设置字体颜色,你知道这几种方式吗?
color设置字体颜色 在color设置字体颜色之前,我们首先了解color在CSS中有几种取值方式,一共有4种方式,若有不全还请在评论区告知谢谢,4种方式如下: 十六进制.十进制. 英文单词.十六进 ...
- fcgi-2.4.1.tar.gz 和 spawn-fcgi-1.6.4.tar.gz 百度云
链接:https://pan.baidu.com/s/1nEzOkFC0-rfVMDy_BygLWg 提取码:ty0e 美好的东西都是免费滴
- SVN--服务端安装和设置---centos7
一.安装环境 [root@localhost ~]# getenforce Disabled [root@localhost ~]# systemctl disable firewalld 二.yum ...
- T-SQL, Part III: Check table's existance
There are several approaches to achieve so. Just list out all approaches I have tried: Approach 1: s ...
- geetest拼图破解
geetest拼图破解: 1.考虑到每个网站的拼图数量很少,可以先把他们下下来,后面在通过RGB来判断差异,来找出需要移动到的位置 2.通过python + selenium来控制页面的操控页面的元素 ...
- nyoj 264-国王的魔镜 (string[-1:-int(str_len/2+1):-1])
264-国王的魔镜 内存限制:64MB 时间限制:3000ms 特判: No 通过数:13 提交数:25 难度:1 题目描述: 国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜 ...
- Ocelot学习笔记
最近因工作需要,开始学习Ocelot.首先简单介绍一下,Ocelot是一个基于.net core的开源webapi 服务网关项目,目前已经支持了IdentityServer认证.根据 作者介绍,Oce ...
- python day 1 homework 2
多级菜单 1 三级菜单 2 可依次选择进入各子菜单 3 所需新知识点,列表,字典 province_info = {":{"name":"黑龙江", ...
- Maven 无法下载依赖包的解决方法---三步dao!!!
版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明. 本文链接:https://www.cnblogs.com/WLCYSYS/p/11932157.html maven 自动下载依赖包出现 ...
- 理解Redis持久化
本文首发于:https://mp.weixin.qq.com/s/WVUGWuNrGoyY_7aDf7NNmA 微信公众号:后端技术指南针 0.前言 通俗讲持久化就是将内存中的数据写入非易失介质中,比 ...