在ASP.NET Core中启动BackgroundService的正确方法

Cre*_*yke 6 c# dependency-injection background-task asp.net-core

我已经在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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

services.AddSingleton<MyBackgroundService>();
Run Code Online (Sandbox Code Playgroud)

我目前(勉强地)通过StartAsync()从方法内部调用(而不是等待)该方法来启动它Configure()

app.ApplicationServices.GetService<SummaryCache>().StartAsync(new CancellationToken());
Run Code Online (Sandbox Code Playgroud)

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

Cos*_*ntu 10

不需要显式调用StartAsync。

呼唤

services.AddSingleton<MyBackgroundService>();
Run Code Online (Sandbox Code Playgroud)

由于所有服务实现都是通过IHostedService接口通过DI解决的,因此将无法正常工作。 编辑:例如 svcProvider.GetServices<IHostedService>() -> IEnumerable<IHostedService>

您需要致电:

services.AddSingleton<IHostedService, MyBackgroundService>();
Run Code Online (Sandbox Code Playgroud)

要么

services.AddHostedService<MyBackgroundService>();
Run Code Online (Sandbox Code Playgroud)

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

  • *为了发现要运行的所有后台服务,该框架依赖于DI并调用servcies.GetServcies &lt;IHostedService&gt;(),从而产生IEnumerable &lt;IHostedServcie&gt;。如果您通过接口注册,这可以解决您的服务。.AddHostedService &lt;T&gt;()确实可以做到这一点(https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.extensions.dependencyinjection.servicecollectionhostedserviceextensions.addhostedservice?view=aspnetcore-2.2) (2认同)