5

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

在此期间,它调用 oMessageReceiver.Receive(TimeSpan.FromSeconds(30))。所以有时当我尝试停止服务时,我必须等待 30 秒才能让 Receive() 进程超时。

一种选择是将超时时间从 30 秒降低到更小。我不确定它会招致什么样的性能损失,但由于没有 BrokeredMessage,该过程不会做任何工作,我真的希望尽可能长时间地保持监听器打开。

我看到 MessageReceiver 上有一个 .BeginReceive() 方法。我有一种感觉,我可以在这里使用一种编程模式,它可以防止我的服务在我等待接收超时时挂起。谁能描述如何在无限运行的 Windows 服务中使用 Begin/End APM 功能?

4

2 回答 2

4

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

至于使用异步方法(开始/结束)的最佳方式,请查看“利用 Windows Azure 服务总线代理消息传递的最佳实践”,其中有几个示例。

于 2013-08-18T17:08:48.977 回答
2

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

使用异步 Begin/End 不会有任何区别。附带说明一下,如果您想异步运行,请考虑使用TaskFactory.FromAsync创建任务包装器,以利用新的异步等待功能。

另请参阅我对同一问题的回答:

取消 Azure 服务总线 QueueClient 长时间运行的接收?

于 2013-08-19T19:21:39.423 回答