簡體   English   中英

如何取消Microsoft ServiceBus MessageReceiver Receive調用?

[英]How can I cancel a Microsoft ServiceBus MessageReceiver Receive call?

我有一個用.NET 4編寫的Windows服務,它創建了包含無限運行while(運行)循環的多個線程。 當我停止服務時,運行的布爾值變為false,我們打破了while循環,一旦每個線程都這樣做,服務終於停止。

在while內部,它調用oMessageReceiver.Receive(TimeSpan.FromSeconds(30))。 因此,有時當我嘗試停止服務時,我必須等待30秒才能使Receive()進程超時。

一種選擇是將超時從30秒降低到更小。 我不確定它會產生什么性能損失,但是由於沒有BrokeredMessage這個過程沒有做任何工作,所以我真的希望盡可能經常地讓聽眾保持開放狀態。

我看到MessageReceiver上有一個.BeginReceive()方法。 我有一種感覺,我可以使用這種編程模式,在我等待接收超時的同時阻止我的服務掛起。 任何人都可以描述如何在無限運行的Windows服務中使用Begin / End APM功能嗎?

在新的2.1 Windows Azure SDK中,他們更改了Service Bus Worker Role模板以使用最近在2.0 SDK中引入的OnMessage。 您可以查看該模板以查看它用於入門的代碼。 在此方法中,您可以設置要在消息到達時執行的操作。 實際上,您還可以在設置OnMessageOptions時在OnMessageOptions上設置MaxConcurrentCalls屬性,該屬性將為您處理其他線程。 如果您使用了OnMessage方法,那么您將執行類似的操作,該服務將關閉QueueClient,以便它不再處理。 如果任何線程上的消息正在處理並且只等待該處理完成,您還可以使用同步指示器跟蹤。

至於使用異步方法(開始/結束)的最佳方法,請查看“ 利用Windows Azure Service Bus Brokered Messaging的最佳實踐 ”,其中有幾個示例。

關閉創建MessageReceiver的MessageFactory以取消接收操作。 在關閉消息工廠之前,在MessageReceiver上調用Abort或Close時遇到了同樣的問題。

使用異步Begin / End將沒有任何區別。 作為旁注,如果要異步運行,請考慮使用TaskFactory.FromAsync創建Task包裝器以利用新的async-await功能。

另請參閱我對此問題的答案:

取消長期運行接收的Azure Service Bus QueueClient?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM