[英]How do you drain down an Azure MessageReceiver message-pump?
我有一个MessageReceiver
,它从队列中抽取消息:
var factory = MessagingFactory.CreateFromConnectionString(connectionString);
var receiver = factory.CreateMessageReceiver(queuePath);
receiver.OnMessageAsync(HandleBrokeredMessageAsync);
HandleBrokeredMessageAsync
是我的委托,接收方将消息泵入其中。
当我在接收器上调用Close()
时,它将停止从队列中进一步发送消息。 为了避免潜在的竞争状况,我想确保所有待处理的处理在返回控制之前都已完成。
我考虑过HandleBrokeredMessageAsync
每次调用跟踪到ConcurrentBag<T>
,并在完成后将其从包中删除。 我将使用BlockingCollection<T>
来阻止进程,直到排空完成为止,但尚不清楚何时调用CompleteAdding()
:我会在调用Close()
之后调用它,但是调用Close()
之间是否会有间隙Close()
以及随后传递给处理程序的消息?
receiver.Close();
pendingMessages.CompleteAdding();
// Can additional messages be pumped after this?
在这里查看示例,因为它使用ManualResetEvent协调Run()方法的关闭和Close操作。 在您检查消息处理并停在那里(不接受下一条消息进行处理)然后在所有这些并发处理器都完成后调用close时,类似的方法可能会起作用?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.