我有一个MessageReceiver
正在从队列中抽取消息:
var factory = MessagingFactory.CreateFromConnectionString(connectionString);
var receiver = factory.CreateMessageReceiver(queuePath);
receiver.OnMessageAsync(HandleBrokeredMessageAsync);
HandleBrokeredMessageAsync
是我的代表,接收者将消息注入其中。
当我调用Close()
接收器时,它将停止从队列中抽取更多消息。为了避免潜在的竞争条件,我想确保在返回控制权之前所有待处理的处理都已完成。
我考虑过将每个调用跟踪HandleBrokeredMessageAsync
到 aConcurrentBag<T>
中,并在它们完成时将它们从包中取出。我会使用 aBlockingCollection<T>
来阻止进程,直到排水完成,但不清楚何时调用CompleteAdding()
:我会在调用后调用它,但调用和随后传递给处理程序的消息Close()
之间是否存在间隙?Close()
receiver.Close();
pendingMessages.CompleteAdding();
// Can additional messages be pumped after this?