确保 .NET Core BackgroundService 初始化完成后再处理接口请求


在JOC开发框架中,在现代应用程序开发中,确保后台服务在完成初始化后再处理接口请求是至关重要的。在 .NET Core 中,我们可以通过使用 BackgroundService 来实现长期运行的后台任务。但是,如何确保在后台服务完成初始化后再开始处理接口请求呢?本文将详细介绍如何通过自定义中间件和 TaskCompletionSource 来实现这一功能。

1. 创建 BackgroundService 并使用 TaskCompletionSource

首先,我们需要定义一个 BackgroundService 并使用 TaskCompletionSource 来跟踪初始化状态。

C# 全选
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

public class MyBackgroundService : BackgroundService
{
    private readonly ILogger<MyBackgroundService> _logger;
    private readonly TaskCompletionSource<bool> _initializationTcs;

    public MyBackgroundService(ILogger<MyBackgroundService> logger, TaskCompletionSource<bool> initializationTcs)
    {
        _logger = logger;
        _initializationTcs = initializationTcs;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        _logger.LogInformation("MyBackgroundService is starting.");

        // 模拟初始化工作
        await Task.Delay(5000, stoppingToken);

        // 标记初始化完成
        _initializationTcs.TrySetResult(true);

        _logger.LogInformation("MyBackgroundService has finished initialization.");

        // 继续执行其他后台任务
        while (!stoppingToken.IsCancellationRequested)
        {
            _logger.LogInformation("MyBackgroundService is doing work.");
            await Task.Delay(5000, stoppingToken); // 模拟其他工作
        }

        _logger.LogInformation("MyBackgroundService is stopping.");
    }
}

2. 创建初始化等待中间件

接下来,我们创建一个自定义中间件,确保在 BackgroundService 完成初始化之前不处理任何接口请求。

C# 全选
using Microsoft.AspNetCore.Http;
using System.Threading.Tasks;
using System.Threading;

public class InitializationMiddleware
{
    private readonly RequestDelegate _next;
    private readonly Task _initializationTask;

    public InitializationMiddleware(RequestDelegate next, Task initializationTask)
    {
        _next = next;
        _initializationTask = initializationTask;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        await _initializationTask; // 等待初始化完成
        await _next(context); // 处理下一个中间件
    }
}

3. 在 Startup.cs 中注册中间件和服务

Startup.cs 中配置服务和中间件,以确保初始化等待中间件被正确注册。

C# 全选
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System.Threading.Tasks;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        var initializationTcs = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
        services.AddSingleton(initializationTcs);
        services.AddHostedService<MyBackgroundService>();

        services.AddControllers();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env, TaskCompletionSource<bool> initializationTcs)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        // 注册初始化等待中间件
        app.UseMiddleware<InitializationMiddleware>(initializationTcs.Task);

        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
}

总结

通过创建自定义中间件 InitializationMiddleware,可以确保在 BackgroundService 完成初始化之前不处理任何接口请求。这个中间件会等待 TaskCompletionSource 的任务完成,然后再继续处理请求。这样可以确保所有接口调用在 MyBackgroundService 完成初始化后才被处理,从而保证服务的稳定性和可靠性。

 

 

版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
张国生
上一篇:C# Dictionary<string,string> TryGetValue不要区分大小写,不区分大小写的字典
下一篇:确保 .NET Core BackgroundService 初始化完成后再处理接口请求
评论列表

发表评论

评论内容
昵称:

联系我们
联系电话:15090125178(微信同号)
电子邮箱:garson_zhang@163.com
站长微信二维码
微信二维码