我有一个用.NET 4编写的Windows服务,该服务创建了多个线程,这些线程包含无限次运行的while(running)循环。当我停止服务时,正在运行的 bool 值将变为false,并且我们退出while循环,一旦每个线程执行了该操作,该服务便最终停止。

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

一种选择是将超时从30秒降低到更小的值。我不确定会带来什么性能损失,但是由于没有BrokeredMessage时该过程无法完成任何工作,因此我真的想尽可能长时间,尽可能长时间地保持监听器处于打开状态。

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

最佳答案

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

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

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

Cancel an Azure Service Bus QueueClient long running Receive?

关于c# - 如何取消Microsoft ServiceBus MessageReceiver的接听电话?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17751394/

10-11 14:57