基于任务的Service Bus API

编辑人员注释: 本文作者 Scott Seely 是 Windows Azure Service Bus团队的开发人员。

我们最近通过 NuGet 推出了 Windows Azure Service Bus客户端 SDK 的最新版本。目前版本号为 v2.0.0-beta。这个版本的 SDK API 中有一些改进,为所有异步API提供了基于 System.Threading.Tasks.Task 的版本。这意味您可以编写普通人都可以阅读的异步代码。如果您想知道哪些类得到了更新,答案很简单:全部更新了!在您之前看到 Begin/End 对的所有位置,您现在都可以看到一个异步版本的方法。因为 SDK 更新版是在 .NET 4.0 上编译的, 因此能在 Visual Studio 2010 和 Visual Studio 2012 上运行。

在这个简短的博文中,原作者想说明几个基本点:

  1. 如何获得 SDK
  2. 如何用通过async/await使用 SDK
  3. 谈一点关于Task出现异常的情况

对于 SDK 的用户而言,最重要的一点是,您现在可以使用Service Bus SDK 来编写异步可读代码。

获取 SDK 公测版

目前的2.0 SDK 并非我们的最终产品。尽管如此,它还是包含了很多可以在您当前项目中使用的元素,让您可以使用 Windows Azure Service Bus来构建产品。此程序包只能通过 NuGet 获取。要将此程序包添加到您的项目中,可以用下面两种方法之一:

  1. 通过 NuGet GUI 安装在 Visual Studio 中
  2. 通过程序包管理器控制台安装在 Visual Studio 中

这些说明的前提是假定您在 Visual Studio 中打开了一个项目并且您希望在该项目中添加Service Bus SDK。对于喜欢使用鼠标的人,请在项目节点或引用节点上右键单击并选择“Manage NuGet Packages…” 。确保您选择了 Include Prerelease(默认为 Stable Only)。然后搜索 servicebus。选择 Windows Azure Service Bus 并点击 Install

Package Manager Console(可通过 View\Other Windows\Package Manager Console 访问)里,通过输入以下内容安装新版本:

Install-Package -Id WindowsAzure.ServiceBus –IncludePrerelease

请确保包含 -ncludePrelease 标志,否则您将无法获取基于任务 API 的版本。

如何用通过async / await使用 SDK

让我们编写一个使用 Microsoft.ServiceBus.NamespaceManager 和 Microsoft.ServiceBus.Messaging.QueueClient 的简单方法。我们将检查队列是否存在,如果不存在就创建一个队列。然后我们将向队列发送消息以及从队列接收消息。就是这样,我们要编写Service Bus版的Hello, World。为了显示异步编程的好处,我们等待5秒后再发送消息。代码中的注释说明了程序的执行过程。

我们在这儿看到等待完成发送和接收的时间约 9 秒。在这段时间,客户可以用 CPU 处理其他事情,而不用一直等待消息出现和返回。您还能发现异步代码变得和同步代码一样易于阅读。作为比较, 看一个原来的异步编程模型代码有多令人畏惧的例子,以下代码仅仅做了检查队列是否存在这一件事:

 

异常和显式任务使用

如果您是异步编程模型(所有的 Begin/End 对)的现有用户,您可能知道 Begin 方法将执行参数验证。如果参数发生任何问题,就可能会抛出异常。处理完成后,还可能发生其他错误。这种情况下,您需要在 Begin 和 End 方法上都捕获异常。为了简化您的开发过程,我们选择让异常只有在任务结束后才抛出。这对您有何意义?这意味着您只用在一个地方捕获异常,不用去更多地方寻找。例如,如果您在异步编程模型中的代码是这样的:

且您选择使用基于任务的 API,则您的代码将会更改,以在 ContinueWith 块中处理所有异常:

 

或者,您也可以选择继续任务,等待其完成,这样您的代码将变成:

如果您选择了更轻松的途径,对应的async/await异常处理代码将进一步变得更容易读(和写):

 

结束语

能够向我们的客户提供这些功能,我们感到非常激动。我们希望这样可以使您的开发更简单,也能使您团队中必须使用Service Bus的人员笑逐颜开。 

本文翻译自: https://blogs.msdn.com/b/windowsazure/archive/2013/04/11/task-based-apis-for-service-bus.aspx