你如何耗尽Azure MessageReceiver消息泵?

时间:2013-10-24 17:16:24

标签: c# concurrency azureservicebus

我有一个MessageReceiver从队列中抽取消息:

var factory = MessagingFactory.CreateFromConnectionString(connectionString);

var receiver = factory.CreateMessageReceiver(queuePath);

receiver.OnMessageAsync(HandleBrokeredMessageAsync);

HandleBrokeredMessageAsync是我的代表,接收者将消息输入。

当我在接收器上呼叫Close()时,它将停止从队列中抽取更多消息。为了避免潜在的竞争条件,我想确保在返回控制之前所有待处理的处理都已完成。

我已考虑将每个HandleBrokeredMessageAsync的来电跟踪到ConcurrentBag<T>,并在完成时将其从包中移除。我会使用BlockingCollection<T>来阻止流程,直到排空结束,但是不清楚何时调用CompleteAdding():我会在调用Close()之后调用它但是可以调用Close()和随后传递给处理程序的消息之间的差距?

receiver.Close();
pendingMessages.CompleteAdding(); 
// Can additional messages be pumped after this?

1 个答案:

答案 0 :(得分:0)

看一下这里的示例,因为它使用ManualResetEvent来协调Run()方法和Close操作的关闭。类似的方法可能适用于您在消息处理中检查并停在那里(不接受下一条消息进行处理)然后在所有这些并发处理器完成时调用close的情况?

https://stackoverflow.com/a/16739691/1078351