在.NET Core通用主机中,BackgroundService任务未在单独的线程上运行

6
新的.NET Core“通用主机”似乎是实现运行多个并发任务的控制台应用程序的好选择。我认为,可以使用IHostedService(或BackgroundService)将它们定义为服务,而不是显式地创建和运行任务。然而,通用主机在同一线程上执行了我所有所谓的“后台任务”。这是期望的行为吗?
public static async Task Main(string[] args)
    {
        var host = new HostBuilder()
        .ConfigureHostConfiguration(...)
        .ConfigureAppConfiguration(...)
        .ConfigureServices((hostContext, services) =>
        {
            services.AddLogging();
            services.AddHostedService<Service1>();
            services.AddHostedService<Service2>();
            services.AddHostedService<Service3>();
        })
        .ConfigureLogging(...)
        .UseConsoleLifetime()
        .Build();

        await host.RunAsync();
    }

通用主机在同一线程上运行我所有的“后台”服务。在“主”线程及每个“后台”服务的StartAsync或ExecuteAsync方法内,发现Thread.CurrentThread.ManagedThreadId等于1。有没有办法确保服务在单独的线程上运行?


从自托管的ASP.NET Core微服务中启动多个后台线程 - jazb
1个回答

5

IHostedService接口只提供启动和停止工作的钩子。根据您的服务实现线程、后台事件等,您需要自己处理。您可以设置一个定时器来异步执行事件或设置一个正在运行的后台线程等。

通用主机不为“服务”指定线程或执行模型。


2
这与我观察到的情况完全一致,但是命名(例如“BackgroundService”)和文档(“在ASP.NET Core中,可以将后台任务实现为托管服务”)在这种情况下有些误导性。我会看看是否有其他回应,否则,这可能会成为被采纳的答案。 - Jan Hettich
1
当您认为文档存在误导时,您也可以在文档页面上提供反馈。 - Martin Ullrich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接