gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:08:31 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com