gpt4 book ai didi

c# - 有没有办法在Asp.Net core 3.1中手动启动BackgroundService

转载 作者:行者123 更新时间:2023-12-04 15:31:56 26 4
gpt4 key购买 nike

我知道在 Asp.Net 3.0(或 3.1)之前,要手动启动 BackgroundService,我们可以从 IHostedService 派生它而是将 DI 注册更改为:

services.AddSingleton<IHostedService, CustomHostedService>();

然后通过在构造函数中注入(inject)服务并调用 StartAsync()手动触发服务启动.

但是,我似乎无法在 Asp.Net Core 3.1 中做到这一点。查看 StartAsync() 的代码方法,在应用启动完成之前启动后台服务。
public async Task StartAsync(CancellationToken cancellationToken = default)
{
_logger.Starting();
await _hostLifetime.WaitForStartAsync(cancellationToken);

cancellationToken.ThrowIfCancellationRequested();
_hostedServices = Services.GetService<IEnumerable<IHostedService>>();

foreach (var hostedService in _hostedServices)
{
// Fire IHostedService.Start
await hostedService.StartAsync(cancellationToken).ConfigureAwait(false);
}

// Fire IApplicationLifetime.Started
_applicationLifetime?.NotifyStarted();

_logger.Started();
}

手动触发后台服务启动的最佳方法是什么?

基本上,这是我的设置:

后台服务
public MyBackgroundService(Func<string, IConsumer> consumerFactory)
{
_consumerFactory = consumerFactory ?? throw new ArgumentNullException(nameof(consumerFactory));
}

消费厂注册
services.AddSingleton<Func<string, IConsumer>>(provider => providerName => provider.ConfigureConsumer(environment, providerName));

private static IConsumer ConfigureConsumer(this IServiceProvider provider, IHostEnvironment environment, string provideName)
{
if (string.IsNullOrEmpty(provideName))
throw new ArgumentNullException(nameof(provideName));

var options = provider.GetRequiredService<IOptions<ConsumerConfig>>();
if (options?.Value == null)
throw new ArgumentNullException(nameof(options));

return environment.IsDevelopment()
? new Consumer(options, provider.GetTopics())
: new Consumer((IOptions<ConsumerConfig>)options.SetSecurityOptions(provider), provider.GetTopics());
}

private static IOptions<Config> SetSecurityOptions(this IOptions<Config> config, IServiceProvider provider)
{
var certService = provider.GetRequiredService<IVaultCertificateService>();
...
return config;
}

本质上是这个 证书服务属性仅在请求进入并执行中间件时设置。从什么时候开始 ExecuteAsync()在后台服务中尝试从工厂获取消费者的实例,无论如何都会执行,我没有正确配置 IConsumer
谢谢

最佳答案

注入(inject)的托管服务从应用程序开始,然后停止。框架不为您提供手动控制。应该有这样的潜在原因。当然,您可以使用线程实现您自己的解决方案,但如果您希望继续使用 Microsoft 的内置解决方案,您可以使用 Queued Background Task .您将启动一个带有空任务队列的后台服务。服务将监听您要添加到队列中的第一个任务。您可以随时添加任务,然后它将在后台运行。

关于c# - 有没有办法在Asp.Net core 3.1中手动启动BackgroundService,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61091146/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com