QueueClient.OnMessage方法是否总是在不同的线程上执行回调参数?
我假设如果MaxConcurrentCalls设置为10,那么queueClient将最多启动10个线程来并行处理消息。如果传入MaxConcurrentConnection值为1或者它是否在当前线程上执行,是否会创建新线程?
我的实际问题:
在工作者角色中,我想处理多个队列,但是它们都会同时处理。 E.g。
_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完成才能执行?
答案 0 :(得分:10)
当您使用OnMessage
注册回调时,会在另一个线程上调用它。如果将MaxConcurrentCalls
设置为10,那么我们将为10条消息创建10个线程,并同时为每条消息回调所有这些消息。您可以在上面显示的队列中执行此操作,但当然在每个单独的回调处理之间没有完成同步或排序。
当我们在新线程上调用回调时,它对于该特定执行/消息是同步的,直到该方法完成或抛出异常,消息处理未完成。如果MaxConcurrentCalls
为0,那么对于每个已注册的回调,只会处理一个线程。但是,如果您有不同的QueueClient实例,则可以向它们注册不同的回调,或者使用不同的并发计数等注册相同的回调。