【问题标题】:Correct way to start a BackgroundService in ASP.NET Core在 ASP.NET Core 中启动 BackgroundService 的正确方法
【发布时间】:2019-03-24 04:41:20
【问题描述】:

我在 ASP.NET Core 2.1 应用程序中实现了一个 BackgroundService:

public class MyBackgroundService : BackgroundService
{
    protected override Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (true)
        {
            await DoSomethingAsync();
            await Task.Delay(10 * 1000);
        }
        return Task.CompletedTask;
    }
}

我已经在我的ConfigureServices() 方法中注册了它:

services.AddSingleton<MyBackgroundService>();

我目前(不情愿地)通过在 Configure() 方法中调用(而不是等待)StartAsync() 方法来启动它:

app.ApplicationServices.GetService<SummaryCache>().StartAsync(new CancellationToken());

启动长时间运行服务的最佳实践方法是什么?

【问题讨论】:

  • 查看 Steve Gordon 的博客:stevejgordon.co.uk/asp-net-core-2-ihostedservice
  • @junnas 不幸的是,这似乎已过时(BackgroundService 可用之前的 ASP.NET 2.0 预览版),并且它没有解释如何在不显式调用 StartAsync() 的情况下启动服务
  • 可以选择hangfire吗? hangfire.io
  • 默认情况下,注册services.AddSingleton&lt;MyBackgroundService&gt;();后会在应用启动时启动,不需要在你自己的代码中专门调用StartAsync()
  • 有什么办法可以停止后台服务自动启动,而是按需启动?

标签: c# asp.net-core dependency-injection background-task


【解决方案1】:

不需要显式调用 StartAsync。

打电话

services.AddSingleton<MyBackgroundService>();

将不起作用,因为所有服务实现都是通过 IHostedService 接口通过 DI 解析的。 编辑: 例如 svcProvider.GetServices&lt;IHostedService&gt;() -&gt; IEnumerable&lt;IHostedService&gt;

您需要致电:

services.AddSingleton<IHostedService, MyBackgroundService>();

services.AddHostedService<MyBackgroundService>();

编辑: AddHostedService 还注册了一个 IHostedService:https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.dependencyinjection.servicecollectionhostedserviceextensions.addhostedservice?view=aspnetcore-2.2

【讨论】:

  • * 来发现所有要运行的后台服务,框架依赖于 DI 并会调用 servcies.GetServcies() 来生成 IEnumerable。如果您通过接口注册,这将解决您的服务。 .AddHostedService() 正是这样做的 (docs.microsoft.com/en-us/dotnet/api/…)
  • 如果出于测试目的我想基于 Web API 调用动态创建多个后台服务实例怎么办?那我可以调用 StartAsync 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
  • 2017-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多