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

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

我在 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());

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

最佳答案

不需要显式调用 StartAsync。

打电话

services.AddSingleton<MyBackgroundService>();

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

您需要调用:

services.AddSingleton<IHostedService, MyBackgroundService>();

services.AddHostedService<MyBackgroundService>();

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

关于c# - 在 ASP.NET Core 中启动 BackgroundService 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52889818/

相关文章:

c# - 在 matlab 代码中使用 C# dll 函数

asp.net-core - 带有消息的自定义错误代码页

Java - 依赖注入(inject) - 第三方库

c# - Xamarin - 查看设备连接到 Wifi 网络的可靠方式 (Android)

c# - 在 BigQuery 中插入具有 C# 中重复记录列的行

asp.net-core - Razor View 未生成 Razor 页面的 href

entity-framework - 在 Entity Framework Core 中的其他上下文中加载属性

c# - 使用 Ninject 的项目依赖项

android - Dagger2 - 在运行时定义/更新对象的值

c# - 什么是委托(delegate)以及它如何允许创建对象