了解.NET 通用主机

写在前面

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

代码实现

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

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 实现

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

相关推荐

  1. ubuntu主机开启ssh服务,ubuntu通过ssh访问主机

    2024-01-01 14:16:02       63 阅读
  2. 【.Net 6.0--通用帮助类--FileHelper】

    2024-01-01 14:16:02       49 阅读
  3. 【.Net 6.0--通用帮助类--ConvertHelper】

    2024-01-01 14:16:02       48 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-01 14:16:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-01 14:16:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-01 14:16:02       87 阅读
  4. Python语言-面向对象

    2024-01-01 14:16:02       96 阅读

热门阅读

  1. github Copilot的基本使用

    2024-01-01 14:16:02       49 阅读
  2. 新概念英语第二册(13)

    2024-01-01 14:16:02       36 阅读
  3. 前端面试题汇总(全网最全)1

    2024-01-01 14:16:02       40 阅读
  4. 怎样解压Centos某个目录下的所有zip压缩文件

    2024-01-01 14:16:02       67 阅读
  5. 在CentOS环境下编译GreatSQL RPM包

    2024-01-01 14:16:02       49 阅读
  6. 2023总结

    2024-01-01 14:16:02       55 阅读
  7. 【最优化方法】矩阵的二次型

    2024-01-01 14:16:02       45 阅读