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

标签 c# .net asynchronous servicebus

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

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

一种选择是将超时从 30 秒降低到更短的时间。我不确定它会导致什么性能损失,但由于该过程在没有 BrokeredMessage 的情况下不会执行任何工作,所以我真的希望尽可能经常和长时间地保持监听器打开。

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

最佳答案

在新的 2.1 Windows Azure SDK 中,他们更改了服务总线 worker 角色模板以使用最近在 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/

相关文章:

c# - 尽管以 UTF-8 编写 XML,但在 XmlElement 中转义 Unicode 字符串

javascript - 等待jquery异步加载后再加载js

javascript - 在这个 javascript 的异步示例中,为什么第二个函数不运行?

c# - 使用 WinDbg 转储时大对象堆的 'Free' block 是什么意思

c# - 使用带有 Mandrill 的 Smtp 客户端发送电子邮件

c# - 如何比较 C# 中的(目录)路径?

c# - YamDocument 以 3 个点结尾的文本表示

c# - 如何在多维数组上使用 LINQ 到 'unwind' 数组?

c# - WPF/控制台混合应用程序

.net - System.Net.Sockets.NetworkStream的异步读取回调