c# - 如何取消 Microsoft ServiceBus MessageReceiver Receive 调用?

标签 c# .net asynchronous servicebus

我有一个用 .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/

相关文章:

javascript - for循环中的异步等待

c# - Winforms的“选项卡”页面上的“关闭”按钮

c# - C# lambda/匿名委托(delegate)中的词法范围

c# - 从大型linq查询中获取“最新”日期时间,该查询当前返回具有日期时间的每条记录

c# - 使用 anchor 自动缩放大小 - 重叠控件

python - Tornado 调度器

android - 异步更新 ListFragment

c# - DataGrid-更改编辑行为

c# - 在应用层之间共享 Entity Framework 模型的最佳方法

c# - 将属性设置为虚拟时停止 Entity Framework 加载