C# Dotnet核心Windows服务中的多个托管服务

C# Dotnet核心Windows服务中的多个托管服务,c#,multithreading,.net-core,windows-services,task,C#,Multithreading,.net Core,Windows Services,Task,我有一个用于netcore 2.0的windows服务,它基于以下示例: 在我的例子中,主托管服务订阅了一个消息队列,并按顺序处理消息(每次出现新消息时,队列api都会引发一个事件)。 如果无法处理任何消息,则将其移动到另一个队列中重试(x次,指数后退)。因此,这需要在一个单独的线程上完成,以免造成主队列处理的延迟 是否可以配置2个HostedService: var builder = new HostBuilder() .ConfigureServices((hos

我有一个用于netcore 2.0的windows服务,它基于以下示例:

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

是否可以配置2个HostedService:

var builder = new HostBuilder()
            .ConfigureServices((hostContext, services) =>
            {
                services.AddHostedService<MyMsgProcessingService>();
                services.AddHostedService<MyRetryService>();
            });
还是只允许您拥有一个IHostedService实现(这是一个好主意)

你想要多少就有多少。只要您同意这样一个事实,即如果流程宕机,那么其中的所有内容(所有服务)都会宕机

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

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

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

我如何确保新线程在服务运行的整个时间内都有效

创建一个前台线程。但是你必须小心,在应用程序关闭时终止这样的线程,在
stopsync
方法调用中处理它

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


使用非阻塞队列在服务之间通信。我不能给你一个关于具体实现的链接,因为有很多,但是你可以开始另一个问题来帮助你找到一个合适的。

谢谢。目前我有一个HostedService,它有两个通过标准IoC注入的QueueClient包装器。每个队列都在等待从各自的队列(主队列和重试队列)引发事件。当消息进入主队列时,处理涉及db访问(异步)和http请求(异步),如果失败,则写入重试队列(异步)。因此,我希望所有操作都是异步的,这意味着在顶层注入的两个QueueClient将不断地请求来自同一线程池的线程?我可以做些什么来确定主队列上处理的优先级吗?猜猜我说的话听起来可能像“只需获取两个线程池”。如果是那样的话,换言之,我应该这么说。单线程池的问题是存在IO线程和工作线程。如果您有大量IO工作(在您的情况下是DB访问和http请求),则有可能由于IO线程耗尽而在某个时候限制这些工作,因此您将无法让异步回调继续快速处理。您需要做的是尝试尽快离开IO线程,这意味着在IO操作后继续(DB/http)工作时间应该很短,可能只是通过运行一个新任务来排队工作线程上的一些工作。但只有当每秒队列中有数千个新项目时,这一点才重要。如果线程数量不再增长,并且正在处理任务,则必须不时监视线程池和应用程序,以注意线程池不足传入消息的数量不断增加。如果队列中的新项目一次处理一个,您在任何情况下都不会有问题。您遇到了相同的问题,然后确认在一个
IHost
下注册和托管多个服务是可以接受的。
public Task StartAsync(CancellationToken cancellationToken)
{
    Task t = Task.Run(() => ProcessRetrys(), cancellationToken);