如何取消Microsoft ServiceBus MessageReceiver Receive调用?

时间:2013-07-19 16:46:25

标签: c# .net asynchronous servicebus

我有一个用.NET 4编写的Windows服务,它创建了包含无限运行while(运行)循环的多个线程。当我停止服务时,运行的布尔值变为false,我们跳出while循环,一旦每个线程都这样做,服务终于停止。

在while内部,它调用oMessageReceiver.Receive(TimeSpan.FromSeconds(30))。因此,有时当我尝试停止服务时,我必须等待30秒才能使Receive()进程超时。

一种选择是将超时从30秒降低到更小。我不确定它会产生什么样的性能损失,但是由于没有BrokeredMessage这个过程没有做任何工作,所以我真的希望尽可能经常地让听众保持开放。

我看到MessageReceiver上有一个.BeginReceive()方法。我有一种感觉,我可以使用这种编程模式,在我等待接收超时的同时阻止我的服务挂起。任何人都可以描述如何在无限运行的Windows服务中使用开始/结束APM功能吗?

2 个答案:

答案 0 :(得分:4)

在新的2.1 Windows Azure SDK中,他们更改了Service Bus Worker Role模板,以使用最近在2.0 SDK中引入的OnMessage。您可以查看该模板以查看它用于入门的代码。在此方法中,您可以设置要在消息到达时执行的操作。实际上,您还可以在设置时在OnMessageOptions上设置MaxConcurrentCalls属性,这将为您处理其他线程。如果您使用了OnMessage方法,那么您将执行类似的操作,该服务将关闭QueueClient,以便它不再处理。如果任何线程上的消息正在处理并等待该处理完成,您也可以使用同步指示器跟踪。

至于使用异步方法的最佳方式(开始/结束),请查看“Best Practices for Leveraging Windows Azure Service Bus Brokered Messaging”,其中有几个示例。

答案 1 :(得分:2)

关闭创建MessageReceiver的MessageFactory以取消接收操作。在关闭消息工厂之前,在MessageReceiver上调用Abort或Close时遇到了同样的问题。

使用异步Begin / End将没有任何区别。 另请注意,如果要异步运行,请考虑使用TaskFactory.FromAsync创建Task包装器以利用新的async-await功能。

另见我对这个问题的回答:

Cancel an Azure Service Bus QueueClient long running Receive?