Dotnet Core Windows 服务中的多个托管服务

Chr*_*sCa 9 c# multithreading windows-services task .net-core

我有一个基于此示例的 netcore 2.0 Windows 服务: https://www.stevejgordon.co.uk/running-net-core-generic-host-applications-as-a-windows-service

在我的例子中,主要托管服务订阅了消息队列并按顺序处理消息(每次出现新消息时,队列 api 都会引发一个事件)。如果任何消息无法处理,它们将被移至不同的队列以重试(x 次,采用指数退避)。因此这需要在单独的线程上完成,以免导致主队列的处理延迟

配置2个HostedServices可以吗:

var builder = new HostBuilder()
            .ConfigureServices((hostContext, services) =>
            {
                services.AddHostedService<MyMsgProcessingService>();
                services.AddHostedService<MyRetryService>();
            });
Run Code Online (Sandbox Code Playgroud)

这确实启动了,并且确实命中了每个服务的StartAsync方法(在接口上)IHostedService

或者你只允许拥有(拥有是个好主意)一种IHostedService实现?

如果两个都可以,慢速服务上的工作会阻碍主服务上的工作吗?

如果只有一个,最好只启动另一个线程来完成重试队列的工作吗?我如何确保新线程在服务运行的整个过程中都存在?循环while似乎不合适,因为我只是在等待引发事件

例如

public Task StartAsync(CancellationToken cancellationToken)
{
    Task t = Task.Run(() => ProcessRetrys(), cancellationToken);
Run Code Online (Sandbox Code Playgroud)

cas*_*rad 7

或者您是否只允许拥有(拥有是一个好主意)一个 IHostedService 实现?

你想要多少就可以有多少。只要您接受这样一个事实:如果流程出现故障,其中的所有内容(所有服务)都会出现故障。

第二件事要考虑的是线程池。线程池对于所有服务都是通用的,因此如果其中一个服务需要线程,其他服务可能会受到影响。

如果两个都可以,慢速服务上的工作会阻碍主服务上的工作吗?

取决于一项服务是否等待来自另一服务的数据。以及他们之间的沟通类型。如果是同步的,那么最慢的线程将成为瓶颈。

我如何确保新线程在服务运行的整个过程中都存在?

创建前台线程。关于如何配置。但是您必须小心,并在应用程序关闭时优雅地终止此类线程,并在StopAsync方法调用中处理它。

while 循环似乎不合适,因为我只是在等待引发事件

使用非阻塞队列在服务之间进行通信。我无法为您提供有关特定实现的链接,因为有很多实现,但您可以提出另一个问题来帮助您找到合适的实现。