サービス バス向けのタスク ベースの API
このポストは、4 月 11 日に投稿された Task Based APIs for Service Bus の翻訳です。
編集メモ : 今回は、Windows Azure サービス バス チームの開発者である Scott Seely の投稿をご紹介します。
先日、Windows Azure サービス バスの新バージョンのクライアント SDK がリリースされ、NuGet を通して利用できるようになっています。この SDK API (現在は v2.0.0-beta) では、あらゆる非同期 API を System.Threading.Tasks.Task ベースで提供するよう強化がなされています。これによって、非同期コードを読みやすい形で記述できるようになります。どのクラスが強化されたかと言うと、答えはシンプルです。すべてが更新されています。あらゆる Begin/End ペアに対して非同期版のメソッドが用意されています。更新された SDK は .NET 4.0 向けにコンパイルされるので、Visual Studio 2010 と Visual Studio 2012 で動作します。
今回は、基本的なポイントについていくつか簡単にご説明します。
1.SDK の入手方法
2.async/await での SDK の使用方法
3.タスクで例外が発生するタイミングについての簡単な説明
このサービス バス SDK を利用することで、非同期コードを読みやすく記述できるようになるという利点があることを、ぜひご理解いただければと思います。
ベータ版の SDK の入手方法
現在のところ、2.0 版の SDK は最終製品とは見なされていませんが、この SDK には Windows Azure サービス バスを使用するソフトウェアを構築するために今日のプロジェクトで利用できる数多くのものが含まれています。このパッケージは NuGet でのみ入手できます。このパッケージをプロジェクトに追加するには、次のいずれかの方法を実行します。
1.NuGet GUI を介して Visual Studio にインストールする
2.パッケージ マネージャー コンソールを介して Visual Studio にインストールする
上記の方法は、Visual Studio でプロジェクトが開かれており、そのプロジェクトにサービス バス SDK を追加しようとしていることを前提としています。マウスを使用する場合は、プロジェクト ノードまたは参照ノードを右クリックして、[Manage NuGet Packages…] を選択します。このとき、[Include Prerelease] を選択するようにしてください (既定では [Stable Only])。その後、「servicebus」を検索します。Windows Azure サービス バスを選択してから、[Install] をクリックします。
パッケージマネージャーコンソール ( [View ] 、 [Other Windows ] 、 [Package Manager Console ] の順に選択) を使用してインストールする場合は、次のように入力します。
Install-Package -Id WindowsAzure.ServiceBus –IncludePrerelease
このとき、-IncludePrelease フラグを必ず含めるようにしてください。これを含めないと、タスク ベース API バージョンを入手できません。
async/await での SDK の使用
Microsoft.ServiceBus.NamespaceManager と Microsoft.ServiceBus.Messaging.QueueClient を使用する簡単なメソッドを記述してみましょう。キューが存在するかどうかを確認し、存在しない場合はこれを作成します。その後、キューとの間でメッセージの送信と受信を行います。ここでは、HelloWorld というサービス バスを記述します。シンプルな非同期プログラミングの利点を理解していただくために、メッセージを送信してから 5 秒後に配信されるように設定します。処理の内容については、コード内のコメントで説明しています。
ここでわかるのは、送信と受信が完了するまでに約 9 秒間待機したということです。その間、クライアントは、メッセージが表示されて制御が戻るまでビジー ウェイトするのではなく、CPU を使用して別の作業を行うことが可能です。さらに、非同期コードが同期コードと同じくらい読みやすくなっています。たとえば、既存のキューを確認するだけの非同期プログラミング モデル コードは、次のように複雑なものになる恐れがあります。
例外と明示的なタスクの使用
非同期プログラミング モデル (Begin/End ペア) を使用しているユーザーなら、Begin メソッドでパラメーターの検証が行われることをご存じかと思います。指定したパラメーターに問題があると、例外がスローされます。処理が完了した後に、別のエラーが発生する場合もあります。そのため、Begin メソッドと End メソッドの両方で例外を取得する必要がありますが、開発作業をシンプルにするために、すべての例外がタスク完了時にのみスローされるようにしました。これは、ユーザーにとってどのような意味があるかというと、ユーザーは複数の場所ではなく、1 か所で例外を取得できるようになります。たとえば、非同期プログラミング モデルによる次のようなコードがあるとします。
タスク ベース API を使用すれば、すべての例外を ContinueWith ブロック内で処理するようにコードを変更できます。
あるいは、タスクの実行が完了するまで待機することもできます。この場合、コードは次のようになります。
通常の場合、同じ async/await による例外処理のコードは、より読みやすく (そして記述しやすく) なります。
おわりに
このような機能をお客様にお届けできることを非常に嬉しく思っています。これによって開発作業が簡単になり、サービス バスにまつわる作業が必要なチームの皆様のお役に立つことができれば幸いです。