了解.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秒后退出主机应用的执行流程,调用结果如下:

相关推荐
志栋智能5 分钟前
大模型驱动运维:重构故障根因分析的“思考”逻辑
运维·服务器·重构·自动化
J总裁的小芒果6 分钟前
参数过多-分批传参
c#
_F_y32 分钟前
Linux网络常用指令
linux·运维·网络
典典分享指南39 分钟前
短视频分镜提示词:让 AI 出片的产品口播
java·c#·bash·composer·symfony
.Hypocritical.1 小时前
Tomcat本地部署+远程服务器部署超详细教程
java·服务器·tomcat
段一凡-华北理工大学1 小时前
高炉炉况智能诊断与预警实战~系列文章18:预警提前量问题:过程滞后与预测窗口的权衡
服务器·网络·人工智能·机器学习·高炉智能化·炉况预警·工业预警滞后
北风toto1 小时前
扩展操作码技术 · 详细笔记
运维·服务器·笔记·软件设计师
笑霸final1 小时前
不用上传服务器!用 Vue3 + ONNX Runtime Web 在浏览器本地实现智能抠图
运维·前端·图像处理·ai·onnx·canva可画·web性能优化
2601_962218472 小时前
万象生鲜系统跨仓调拨算法助力生鲜企业供应链数字化协同运营
大数据·运维·微服务·云原生·架构
Z5998178412 小时前
c#软件开发学习笔记--WPF(Canvas、数据绑定、MVVM模式、值转换器)
笔记·学习·c#