11

QueueClient.OnMessage 方法是否总是在不同的线程上执行回调参数?

我假设如果 MaxConcurrentCalls 设置为 10,那么 queueClient 将启动最多 10 个线程来并行处理消息。如果传入 MaxConcurrentConnection 值 1,是否会创建一个新线程,或者它是否在当前线程上执行?

我的实际问题:
在工作人员角色中,我想处理多个队列,但同时处理它们。例如

        _queueClient1.OnMessage(x =>
        {
            // Do something
        }, new OnMessageOptions { MaxConcurrentCalls = 1});

        _queueClient2.OnMessage(x =>
        {
            // Do something
        }, new OnMessageOptions { MaxConcurrentCalls = 1 });

        _queueClient3.OnMessage(x =>
        {
            // Do something
        }, new OnMessageOptions { MaxConcurrentCalls = 1 });

        _queueClient4.OnMessage(x =>
        {
            // Do something
        }, new OnMessageOptions { MaxConcurrentCalls = 1 });

这是否会导致每个回调并行执行,以便 _queueClient4 回调在执行之前不会等待 _queueClient2 完成?

4

1 回答 1

11

当您注册一个回调时,OnMessage它会在不同的线程上调用。如果您设置MaxConcurrentCalls为 10,那么我们将为 10 条消息创建 10 个线程,并为每条消息同时回调所有这些线程。如上所示,您也可以跨队列执行此操作,但当然在每个单独的回调处理之间没有同步或排序。

当我们在新线程上调用回调时,该特定执行/消息是同步的,因为在方法完成或抛出异常之前,消息处理尚未完成。如果MaxConcurrentCalls为 0,那么每个注册的回调将只处理一个线程。但是,当您有不同的 QueueClient 实例时,您可以向它们注册不同的回调或具有不同并发计数的相同回调等。

于 2013-08-15T20:50:31.477 回答