【问题标题】:Does ServiceBusProcessor use thread poolServiceBusProcessor 是否使用线程池
【发布时间】:2021-04-13 19:07:37
【问题描述】:

问题是关于 ServiceBusProcessor from Azure.Messaging.ServiceBus v7.1.1 与 .NET 5 一起使用

当我这样做时

var processor = client1.CreateProcessor("queueName", 
    new ServiceBusProcessorOptions { MaxConcurrentCalls = 3 });
processor.ProcessMessageAsync += ProcessMessageAsync;
await processor.StopProcessingAsync();

除非我在ProcessMessageAsync 的线程池中显式创建Tasks,否则我假设它将全部在1 个线程中运行?
(如果其他 2 个调用被 IO 阻塞并释放线程,则可以运行 3 个并发调用)

这对吗?

【问题讨论】:

    标签: .net concurrency azureservicebus


    【解决方案1】:

    处理器运行一组后台任务来接收消息,每个任务独立工作。在您的示例中,因为 MaxConcurrentCalls 为 3,您将有 3 个任务同时运行。

    每个任务都会调用您的ProcessMessageAsync 处理程序,这意味着您的处理程序也在同时执行。除非您使用共享资源或显式同步处理程序调用,否则阻塞一个处理程序调用不会阻塞其他处理程序。

    【讨论】:

    • 谢谢!您能否指出它在代码中创建任务的位置?正在尝试查找任务,但我发现的只是一个基于 MaxConcurrentCalls 配置的信号量。
    • 很高兴。 RunReceiveTaskAsync是非会话场景的核心。
    • 谢谢!我期待在某处找到new Task().Run()。在RunReceiveTaskAsync() 中,它从ReceiveAndProcessMessagesAsync() 检索任务,然后是ReceiveAndProcessMessagesAsync() -> ProcessOneMessageWithinScopeAsync () -> ProcessOneMessage() -> OnMessageHandler(),我在此调用堆栈的任何地方都看不到Task.Run() 。是什么让它并发?
    • 调用ReceiveAndProcessMessagesAsync 时不等待任务。每个调用都会启动一个操作,该操作本身就是异步的。由于它们的结构和依赖关系,这些任务不太可能同步完成,因此每个任务都将启动并将控制权返回给调用者RunReceiveTaskAsync,同时任务在后台运行完成。 _messageHandlerSemaphore 通过限制任何时候可以处于活动状态的任务数量来确保遵守最大并发调用值。
    • 我明白了,所以它没有使用线程池,也没有使用多个线程,如果我愿意,我需要在ProcessMessageAsync 处理程序的代码中使用Task.Run()
    猜你喜欢
    • 1970-01-01
    • 2011-07-31
    • 2011-05-30
    • 2017-08-06
    • 1970-01-01
    • 2015-09-30
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多