了解.NET 通用主机

写在前面

.NET 通用主机负责应用启动和生存期管理,主机是封装应用资源和生存期功能的对象,通用主机可用于其他类型的 .NET 应用程序,如控制台应用;.NET 通用主机基于类库Microsoft.Extensions.Hosting 来实现,本文记录如何使用.NET 辅助角色服务模板来创建通用主机。

代码实现

以下示例是注册 IHostApplicationLifetime 事件的 IHostedService 实现

cs 复制代码
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

public sealed class ExampleHostedService : IHostedService
{
    private readonly ILogger _logger;
    private IHostApplicationLifetime _applicationLifetime;

    public ExampleHostedService(
        ILogger<ExampleHostedService> logger,
        IHostApplicationLifetime appLifetime)
    {
        _logger = logger;

        appLifetime.ApplicationStarted.Register(OnStarted);
        appLifetime.ApplicationStopping.Register(OnStopping);
        appLifetime.ApplicationStopped.Register(OnStopped);

        _applicationLifetime = appLifetime;
    }

    public Task StartAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("1. StartAsync has been called.");

        return Task.CompletedTask;
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("4. StopAsync has been called.");

        return Task.CompletedTask;
    }

    private async void OnStarted()
    {
        _logger.LogInformation("2. OnStarted has been called.");

        var count = 0;
        var task = Task.Run(() =>
        {
            while (true)
            {
                count++;
                Console.WriteLine("running...");
                Thread.Sleep(1000);
                if (count == 5)
                {
                    _applicationLifetime.StopApplication();
                }
            }
        });
    }

    private void OnStopping()
    {
        _logger.LogInformation("3. OnStopping has been called.");
    }

    private void OnStopped()
    {
        _logger.LogInformation("5. OnStopped has been called.");
    }
}

修改辅助角色服务模板以添加 ExampleHostedService 实现

cs 复制代码
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;

HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
builder.Services.AddHostedService<ExampleHostedService>();

IHost host = builder.Build();
host.Run();
 
Environment.Exit(0);

调用示例

运行示例后可以用Ctrl+C或等待5秒后退出主机应用的执行流程,调用结果如下:

相关推荐
Benszen11 分钟前
Docker容器化技术全解析
运维·docker·容器
IMPYLH16 分钟前
Linux 的 false 命令
linux·运维·服务器·bash
小江的记录本25 分钟前
【Linux】《Linux常用命令汇总表》
linux·运维·服务器·前端·windows·后端·macos
一匹电信狗34 分钟前
【Linux我做主】进程程序替换和exec函数族
linux·运维·服务器·c++·ubuntu·小程序·开源
加农炮手Jinx39 分钟前
Flutter 三方库 cli_script 鸿蒙化极简命令行执行引擎适配探索:在多维沙盒终端环境注入异构 Shell 串联逻辑彻底拔高全自动化容器脚本运维及-适配鸿蒙 HarmonyOS ohos
运维·flutter·harmonyos
JoyCong19981 小时前
纳睿雷达×ToDesk:突破时空限制,远程运维让“中国智造”雷达更高效
运维·科技·电脑·远程操作
RisunJan1 小时前
Linux命令-mysqlimport(为MySQL服务器用命令行方式导入数据)
linux·服务器·mysql
:mnong2 小时前
Superpowers 项目设计分析
java·c语言·c++·python·c#·php·skills
Saniffer_SH2 小时前
【每日一题】一台可编程的PCIe 6.0主机 + 一套自动化CTS验证平台 + 一个轻量级链路分析系统
运维·服务器·测试工具·fpga开发·自动化·计算机外设·硬件架构
吕司2 小时前
Linux线程的概念
linux·运维·服务器