2013-07-19 17 views
5

我有一個用.NET 4編寫的windows服務,它創建了包含無限運行(while)循環的多個線程。當我停止服務時,正在運行的布爾變成false,我們跳出while循環,一旦每個線程都這樣做,服務最終會停止。如何取消Microsoft ServiceBus MessageReceiver接收呼叫?

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

一種選擇是將超時從30秒降低到更小。我不確定它會帶來什麼樣的性能損失,但是由於這個過程沒有BrokeredMessage沒有做任何工作,我真的希望儘可能保持聽衆的開放。

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

回答

2

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

使用異步開始/結束將沒有區別。 作爲旁註,如果您想異步運行,請考慮使用TaskFactory.FromAsync創建任務包裝來利用新的異步等待功能。

另見我的回答對這個問題對於同一個問題:

Cancel an Azure Service Bus QueueClient long running Receive?

4

在新的2.1 Windows Azure SDK中,他們已將服務總線工作者角色模板更改爲使用最近在2.0 SDK中引入的OnMessage。您可以查看該模板,看看它使用什麼代碼開始。在這種方法中,您設置了一條消息到達時執行的操作。實際上,您可以在設置時在OnMessageOptions上設置MaxConcurrentCalls屬性,以便爲您處理其他線程。如果你使用OnMessage的方法,你會做類似的事情,在服務將關閉QueueClient,以便它不會再處理。您還可以跟蹤同步指示符,瞭解是否有任何線程上的消息正在處理,並只等待該處理完成。

至於使用異步方法(開始/結束)的最佳方式,請查看「Best Practices for Leveraging Windows Azure Service Bus Brokered Messaging」,它有幾個例子。