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