.NET Core 3.1和WorkerServices构建Windows服务

介绍

ASP.NET Core 3增加了一个非常有意思的功能Worker Service.他是一个ASP.NET Core模板,他允许我们创建托管长期的运行的后台服务,这些服务具体实现IHostedService接口的后台任务逻辑,他被成为"托管服务".同时他们可以部署到windows中Windows服务,以及Linux守护程序.

创建一个托管服务

我们通过命令行界面中的dotnet new 命令。通过如下代码创建一个名为customWorker的WorkerService的应用。


dotnet new worker -o customWorker

Program.cs:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting; namespace WorkerServiceDemo
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
} public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
});
}
}

Worker:

BackgroundService是实现了IHostedService的基类.调用 ExecuteAsync(CancellationToken) 来运行后台服务。实现返回一个Task,其表示后台服务整个生存期.在 ExeuteAsync(例如通过调用await)之前,不会启动任何其他服务.避免在ExecuteAsync中执行长时间的阻塞初始化. StopAsync(CancellationToekn) 中的主机块等待完成ExecuteAsync

调用 IHostedService.StopAsync 时,将触发取消令牌。 当激发取消令牌以便正常关闭服务时,ExecuteAsync 的实现应立即完成。 否则,服务将在关闭超时后不正常关闭。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging; namespace WorkerServiceDemo
{
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger; public Worker(ILogger<Worker> logger)
{
_logger = logger;
} public override async Task StartAsync(CancellationToken cancellationToken)
{
await base.StartAsync(cancellationToken);
} public override async Task StopAsync(CancellationToken cancellationToken)
{
await base.StopAsync(cancellationToken);
} protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(1000, stoppingToken);
}
} public override void Dispose()
{
}
}
}

已使用AddHostedService扩展方法在 IHostBuilder.ConfigureServices(Program.cs)中注册该服务。


services.AddHostedService<Worker>();

WorkerServices部署到Windows服务

安装 WorkerServices模板

在IHostBuilder使用UseWindowsService扩展方法


using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting; namespace WorkerServiceDemo
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
} public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args) .ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
}).UseWindowsService(); ; }
}
}

现在我们可以部署我们的windows服务了。

发布方式

  • 使用sc.exe工具
  • 直接部署exe文件

发布Windows服务


dotnet restore
dotnet publish

sc.exe部署


sc.exe create DemoWorker binpath= publish\xxxx.exe
sc.exe start WorkerServicesName

部署exe文件


WorkerServicesName.exe install
WorkerServicesName.exe start

使用sc.exe停止和删除


sc.exe stop WorkerServicesName
sc.exe delete WorkerServicesName

非sc.exe停止和删除


WorkerServicesName stop
WorkerServicesName uninstall

在Linux设置守护程序

添加Microsoft.Extensions.Hosting.Systemd NuGet软件包

将UseSystemd()添加上。


public static IHostBuilder CreateHostBuilder(string[] args)
{ return Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
}).UseSystemd(); }

在Linux上设置为守护程序。

Reference

https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-3.1&tabs=visual-studio

https://github.com/hueifeng/BlogSample/tree/master/src/WorkerServiceDemo

作者:@冯辉

WorkerServices构建Windows服务的更多相关文章

  1. .NET Core 3.1和WorkerServices构建Windows服务

    介绍 ASP.NET Core 3增加了一个非常有意思的功能Worker Service.他是一个ASP.NET Core模板,他允许我们创建托管长期的运行的后台服务,这些服务具体实现IHostedS ...

  2. 玩转Windows服务系列——使用Boost.Application快速构建Windows服务

    玩转Windows服务系列——创建Windows服务一文中,介绍了如何快速使用VS构建一个Windows服务.Debug.Release版本的注册和卸载,及其原理和服务运行.停止流程浅析分别介绍了Wi ...

  3. Topshelf一个用于使用.NET构建Windows服务框架

    1 Topshelf是什么? Topshelf是用于托管使用.NET框架编写的Windows服务的框架.服务的创建得到简化,从而使开发人员可以创建一个简单的控制台应用程序,可以使用Topshelf将其 ...

  4. ASP.NET Core Web程序托管到Windows 服务

    前言 在 .NET Core 3.1和WorkerServices构建Windows服务 我们也看到了,如何将workerservices构建成服务,那么本篇文章我们再来看看如何将web应用程序托管到 ...

  5. python 3.5构建WINDOWS推送服务

    import ConfigParser import os import sys cf = ConfigParser.ConfigParser() #绝对路径获取 ABSPATH=os.path.ab ...

  6. 玩转Windows服务系列汇总

    玩转Windows服务系列汇总 创建Windows服务 Debug.Release版本的注册和卸载及其原理 无COM接口Windows服务启动失败原因及解决方案 服务运行.停止流程浅析 Windows ...

  7. 玩转Windows服务系列——给Windows服务添加COM接口

    当我们运行一个Windows服务的时候,一般情况下,我们会选择以非窗口或者非控制台的方式运行,这样,它就只是一个后台程序,没有界面供我们进行交互. 那么当我们想与Windows服务进行实时交互的时候, ...

  8. 玩转Windows服务系列——Debug、Release版本的注册和卸载,及其原理

    Windows服务Debug版本 注册 Services.exe -regserver 卸载 Services.exe -unregserver Windows服务Release版本 注册 Servi ...

  9. 玩转Windows服务系列——创建Windows服务

    创建Windows服务的项目 新建项目->C++语言->ATL->ATL项目->服务(EXE) 这样就创建了一个Windows服务项目. 生成的解决方案包含两个项目:Servi ...

随机推荐

  1. php 基础 PHP保留两位小数的几种方法

    $num = 10.4567; //第一种:利用round()对浮点数进行四舍五入 echo round($num,2); //10.46 //第二种:利用sprintf格式化字符串 $format_ ...

  2. C/C++网络编程9——多进程服务器端实现

    #include <iostream> #include <unistd.h> #include <cstdlib> #include <arpa/inet. ...

  3. eclipse导入项目上面有个红叉X

    问题: 今天突然想到一个以前做过的项目,想导入到新环境中,发现不管咱整都一个红叉X, 我记得以前好像碰到过类似的问题,当时三秒搞定,谁知道时间一长,三分钟没有搞定. 还是记录下: 一般导入项目出错,肯 ...

  4. 深浅copy浅析

    Python代码在开始执行的时候,代码会被系统从硬盘调入内存,等候CPU执行,至于怎么个调入逻辑,还不清楚. 在高级语言中,变量是对内存及其地址的抽象.也就是说变量就是内存地址. 那么我们先来介绍两种 ...

  5. winform和wpf里必知的多线程知识

    背景: 很多小伙伴经常在群里问线程的问题,平时我经常转一些视频教程这些人不看,我就自己写个总结吧 不过还是要注意的是,切换本来就不能太频繁,要一口气改. wpf的viewmodel就不需要UI线程,更 ...

  6. Windows密码安全性测试

    一.本地管理员密码如何直接提取 1.1直接通过mimikatz读取管理员密码 (不能交互式,不能在webshell下用,图形化界面很好用) 第一条:privilege::debug          ...

  7. IDEA导入项目后,导入artifacts 方法 以及 Spring的配置文件找不到的解决方法

    我们一般选择 open 项目,如果没有artifacts 的添加选项,我们就要选择 import 项目. 如果没有artifacts ,项目下面会有错误提示,点击错误提示Fix,设置里面导入artif ...

  8. spring mvc绑定参数之 类型转换 有三种方式:

    spring mvc绑定参数之类型转换有三种方式: 1.实体类中加日期格式化注解(上次做项目使用的这种.简单,但有缺点,是一种局部的处理方式,只能在本实体类中使用.方法三是全局的.) @DateTim ...

  9. System.Diagnostics.Conditional 的妙用 -- 把文档放在代码中

    最近的工作跟 UI 打交道比较多, 各种坑. 今天从 Prefab 的序列化功能来说说 System.Diagnostics.Conditional 的妙用. 我们做 UI 面对各种按钮, 组件的获取 ...

  10. 一文解读CDN (转)

    如今这个移动互联网时代,越来越多的人使用手机观看视频,丰富自己的娱乐生活. 可是,大家在追剧的时候,有没有想过一个问题——为什么有时候明明自己手机的网速很快,但观看视频时,仍然卡顿? 回答这个问题之前 ...