【问题标题】:BackgroundService tasks not running on separate threads in .NET Core Generic HostBackgroundService 任务未在 .NET Core 通用主机中的单独线程上运行
【发布时间】:2018-10-16 23:01:56
【问题描述】:

新的 .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。有没有办法确保服务在不同的线程上运行?

【问题讨论】:

标签: c# asp.net-core .net-core


【解决方案1】:

IHostedService 接口只为您提供启动和停止工作的挂钩。您负责根据您的服务的功能自行实现线程、后台事件等。您可以设置一个异步执行事件的计时器或设置一个正在运行的后台线程等。

通用主机并不意味着您的“服务”的线程或执行模型。

【讨论】:

  • 这当然与我观察到的一致,但是命名(例如“BackgroundService”)和文档(“在 ASP.NET Core 中,后台任务可以实现为托管服务”)相当具有误导性在这种情况下。我会看看是否有其他回应;否则,这很可能会成为公认的答案。
  • 当您认为文档具有误导性时,您也可以在文档页面上提供反馈
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-31
  • 2016-06-19
  • 1970-01-01
相关资源
最近更新 更多