2013-07-19 7 views
5

私は.NET 4で書かれたWindowsサービスを持っていて、無限に実行中の(実行中の)ループを含む複数のスレッドを作成します。私がサービスを停止すると、実行中のbooleanはfalseになり、whileループから抜け出し、各スレッドがそれを実行すると、サービスは最終的に停止します。一方、内部Microsoft ServiceBus MessageReceiver Receiveコールをキャンセルするにはどうすればよいですか?

、それはoMessageReceiver.Receive(TimeSpan.FromSeconds(30))を呼び出します。時にはサービスを停止しようとすると、Receive()プロセスがタイムアウトするまで最大30秒待たなければなりません。

1つの選択肢は、タイムアウトを30秒からそれ以下に減らすことです。どのようなパフォーマンス上の不利益が発生するのか分かりませんが、プロセスはBrokeredMessageなしでは何もしないので、実際にはリスナーを可能な限り長く開いておきたいと思います。

MessageReceiverに.BeginReceive()メソッドがあることがわかります。私は、ここで使用できるプログラミングパターンがあり、受信がタイムアウトになるのを待っている間、サービスがハングしないようにすることができます。無限に稼働しているWindowsサービスでBegin/End APM機能を使用する方法を説明できる人はいますか?

答えて

2

受信操作をキャンセルするためにMessageReceiverが作成されたMessageFactoryを閉じます。メッセージファクトリを閉じる前に、MessageReceiverでAbortまたはCloseを呼び出すときも同じ問題がありました。

非同期のBegin/Endを使用すると違いはありません。 非同期で実行する場合は、TaskFactory.FromAsyncを使用してタスクラッパーを作成して、新しい非同期待機機能を利用することを検討してください。

また同じ問題に関して、この質問に私の答えを参照してください。

Cancel an Azure Service Bus QueueClient long running Receive?

4

新しい2.1のWindows AzureのSDKでは、彼らは最近、2.0 SDKで導入されたのonMessageを使用するサービスバスWorkerロールテンプレートを変更しました。そのテンプレートを調べて、どのコードを使用して開始するかを確認できます。この方法では、メッセージが到着したときに実行するアクションを設定します。実際には、OnMessageOptionsにMaxConcurrentCallsプロパティを設定して、追加スレッドを処理するように設定することもできます。 OnMessageのアプローチを使用した場合は、サービスがQueueClientを終了させて​​処理をやり直すような場合は、同様の処理を行います。また、ANYスレッド上のメッセージが処理中であった場合に同期インジケーターを使用して追跡し、その処理のみが完了するのを待つこともできます。

非同期メソッド(Begin/End)を使用する最善の方法として、いくつかの例がある "Best Practices for Leveraging Windows Azure Service Bus Brokered Messaging"をチェックしてください。

関連する問題