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 完成才能执行?
最佳答案
当您使用 OnMessage
注册回调时,它将在不同的线程上调用。如果您将 MaxConcurrentCalls 设置为 10,那么我们将为 10 条消息创建 10 个线程,并同时为每条消息回调所有这些线程。您也可以跨队列执行此操作,如上面所示,但当然每个单独的回调处理之间没有同步或排序。
当我们在新线程上调用回调时,该特定执行/消息是同步的,因为直到方法完成或引发异常,消息处理才完成。如果 MaxConcurrentCalls 为 0,则只会为每个注册的回调处理一个线程。但是,当您有不同的 QueueClient 实例时,您可以向它们注册不同的回调或具有不同并发计数的相同回调等。
关于azure - Azure ServiceBus QueueClient.OnMessage 是否在不同的线程上执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18255323/