我有一个MessageReceiver
这是从队列抽消息:您如何排除Azure 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?