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

时间:2019-09-03 13:30:54

标签: c# multithreading .net-core windows-services task

我有一个基于此示例的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>();
            });

这确实开始,并且确实击中了每个服务的StartAsync方法(在IHostedService界面上)

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

如果两个都没问题,慢速服务上的工作会否阻碍主服务上的炒锅?

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

例如

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

1 个答案:

答案 0 :(得分:1)

  

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

您可以根据需要拥有任意数量。只要您对以下事实感到满意,那就是如果该进程出现故障,那么其中的所有内容(所有服务)也都将崩溃。

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

  

如果两个都没问题,慢速服务上的工作会否阻碍主服务上的炒锅?

取决于一项服务是否等待另一项服务的数据。以及关于它们之间的通信类型。如果是同步的,则最慢的线程将成为瓶颈。

  

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

创建一个前台线程。 AboutHow to configure.,但您必须小心,并在应用程序关闭时以StopAsync方法调用对其进行处理,并优雅地终止此类线程。

  

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

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