我有一个用 .NET 4 编写的 Windows 服务,它创建多个线程,其中包含无限运行的 while(running) 循环。当我停止服务时,正在运行的 bool 值变为 false,我们跳出 while 循环,一旦每个线程都这样做,服务最终会停止。
在 while 内,它调用 oMessageReceiver.Receive(TimeSpan.FromSeconds(30))。所以有时当我尝试停止服务时,我必须等待最多 30 秒才能让 Receive() 进程超时。
一种选择是将超时从 30 秒降低到更小。我不确定它会导致什么性能损失,但是由于该过程在没有 BrokeredMessage 的情况下不会做任何工作,因此我真的希望尽可能经常和长时间地保持监听器打开。
我看到 MessageReceiver 上有一个 .BeginReceive() 方法。我有一种感觉,我可以在这里使用一种编程模式,它可以防止我的服务在等待接收超时时挂起。谁能描述如何在无限运行的 Windows 服务中使用开始/结束 APM 功能?
最佳答案
在新的 2.1 Windows Azure SDK 中,他们更改了服务总线工作角色模板,以使用最近在 2.0 SDK 中引入的 OnMessage。您可以查看该模板以查看它用于入门的代码。在这种方法中,您设置了在消息到达时要执行的操作。实际上,您还可以在 OnMessageOptions 上设置 MaxConcurrentCalls 属性。设置它时,它将为您处理额外的线程。如果您使用 OnMessage 方法,您将执行类似的操作,其中服务将关闭 QueueClient 使其不再处理。您还可以使用同步指示器跟踪任何线程上的消息是否正在处理,并仅等待该处理完成。
至于使用异步方法(开始/结束)的最佳方法,请查看“Best Practices for Leveraging Windows Azure Service Bus Brokered Messaging ”,其中有几个示例。
关于c# - 如何取消 Microsoft ServiceBus MessageReceiver Receive 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17751394/