简介
在Visual Studio中异步CTP (SP1刷新)的新功能预览,让你写异步方案,只是比现在的.NET Framework的方法麻烦一点。 您可以编写异步代码,它与同步代码看起来非常像,可以让编译器处理的回调函数。
本演练开始同步WPF应用程序查找并显示在Netflix的目录。 演练显示如何更改使用的CTP功能的同步解决方案,以异步的解决方案。
该应用程序使用打开数据协议(OData的)API来查询,在您指定的年发行的电影Netflix的目录。 有关OData的信息,请参阅Netflix website.。
先决条件
为了完成本演练,您必须安装带有SP1的Microsoft Visual Studio 2010 ,并安装异步CTP在计算机上。
要打开异步CTP初始页面
- 转到我的文档\ Microsoft Visual Studio中异步的CTP \文件。
- 双击Readme.hta。
- 或者,单击开始 , 所有程序,Visual Studio的异步CTP,然后异步自述 。
要测试一个应用程序的同步版本
- 在异步CTP初始页面,请在C#或VB的入门入门部分在Visual Studio中打开项目。
- 按Ctrl + F5运行该应用程序。
- 出现下面的窗口。
- 在发行年 “框中键入一年,然后单击” 搜索 “按钮。 应用程序搜索Netflix的目录,在这一年发行的电影,显示每个标题“框艺术”,并显示匹配的总数。
- 输入最近一年,然后再次单击“ 搜索 ”按钮。 请注意同步的解决方案中的下列行为:
- 显示不改变,直到程序结束。 结果“面板不清零,显示任何新的箱子艺术和搜索过程右上方状况文本不报告分类汇总。 您会看到只在最后的冠军数量。
- 更糟糕的是,程序运行时,你不能操作它。 您不能调整大小,移动或最小化窗口,你不能滚动, 您不能使用关闭按钮(在右上角的红色区域中的X),以结束该程序,如果你厌倦了等待结果。 即使关闭Visual Studio中,没有任何效果,这时候你需要等待。
- 如果Netflix的网站是出于某种原因,UI冻结,而程序等待时间,再次,你需要等待。
要启动异步解决方案的转换,增加了CTP的参考
- 在项目菜单上,单击添加引用 。 添加引用对话框。
- 在“ 浏览 ”选项卡,导航到异步CTP样品的下载位置。 默认情况下,下载位置是我的文档\ Microsoft Visual Studio中异步的CTP \ SAMPLES。
- 点击AsyncCtpLibrary.dll“,然后单击” 确定 “ “。
要转换的代码异步应用程序
正如你看到程序“,以测试一个应用程序的同步版本,”搜索应用程序,在指定的一年上映的电影的Netflix的目录。 它显示每个影片相关的框艺术。 箱子艺术是那部电影的Netflix的网页链接。
在应用程序的两种方法涉及从网上检索信息,这些都是你需要改变转换,从一个同步的解决方案异步解决方案的方法。
- LoadMovies套舞台上,然后反复调用QueryMovies一次获取XML数据,10(pageSize的变量的值)的电影。 它要求DisplayMovies显示结果。
- QueryMovies访问Web检索关于未来的10部电影信息。 从在结果中的每个条目,挑选出显示使用领域:标题,URL,和箱子艺术。
下面的步骤转换这两个同步方法的异步方法。 当你做出每一个变化,一个错误信息引导您到下一个。
- MainPage.xaml中 ,在解决方案资源管理器右键单击,然后单击查看代码以打开代码编辑器中的代码。
- QueryMovies是从官网上下载直接下载的,所以它是异步解决方案: 在Visual Basic中,单击“ 全部 ”选项卡。
选择最后一个,DownloadStringTaskAsync,异步,基于任务的异步CTP提供WebClient的扩展方法。 如果您没有看到下拉列表的方法,只需键入它。 - 为了使调用异步方法DownloadStringTaskAsync,你必须使QueryMovies成为异步方法。
首先,在C#中添加await 或Await 在Visual Basic中,添加在DownloadStringTaskAsync的前面,如下面的代码所示。
|
DownloadStringTaskAsync返回一个任务,并await 或者Await 任务。 您可以取代以前的单行分配与下面的两行代码进行转换明确。
// C#
// This code is not part of the solution.
Task<string> theTask = client.DownloadStringTaskAsync(new Uri(url));
string data = await theTask;
' Visual Basic
' This code is not part of the solution.
Dim theTask As Task(Of String) = client.DownloadStringTaskAsync(New Uri(url))
Dim data As String = Await theTask
接下来,添加在Visual Basic中的QueryMovies定义在C# 或 async修饰符异步 。 您可以使用await 或者Await 关键字,立即封闭方法或lambda表达式包含async or Async 修饰符。
|
- 异步方法的返回类型必须是 void ,任务,或在C# 中的任务<T>。 在Visual Basic中,方法必须是一个Sub ,或一个Function ,返回Task 或Task (T)的。 在C#里边从Movie[] 到Task<Movie[]> ,在VB里边是从Movie() 到Task(Of Movie()) 。
|
- 添加以下 using指令或Imports语句在代码文件的顶部,以建立Task的任务定义。
|
- 按照惯例,异步方法应以“异步”结尾的名称。 更改方法名称QueryMovies QueryMoviesAsync。
|
-
QueryMovies转换QueryMoviesAsync完成。 下一步,申请LoadMovies相同的过程,这就要求现在的异步方法QueryMoviesAsync。 对于这种方法,你不必改变返回值的类型,因为该方法不返回一个有意义的值。
首先,改变LoadMovies从QueryMovies QueryMoviesAsync调用的方法名称。
|
- 其次,因为QueryMoviesAsync是一个异步方法,在C#添加await 或Visual Basic中的Await 在前面的调用。
|
- 第三,增加异步或异步修饰符的LoadMovies定义。
|
- 最后,在C#中使用重构,重命名或在Visual Basic 改变 LoadMovies 到 LoadMoviesAsync 。
|
这就是它! 你叫一个不同的WebClient方法,添加using指令或 Imports语句,添加了几个关键字,更名为两种方法,并修改了返回类型,和你有一个异步解决方案。
运行和测试程序
- 按Ctrl + F5运行该应用程序。
- 从程序重复步骤4和5的测试“,以测试一个应用程序的同步版本。” 注意改善异步行为提供:
- 结果不都发生在程序结束的同时。 例如,显示面板的清除只要你点击“ 搜索 ”按钮,并框艺术是不是所有在同一时间显示。 你首先看到的结果,只要你点击“ 搜索 ”按钮。
- 您可以移动或调整窗口大小,或在滚动的过程,而运行。
- 通过点击“关闭”按钮(在右上角的红色区域中的X),您可以结束在任何时候搜索。
- 在搜查过程中的进展情况的文字更新,显示你有多少匹配的标题已经发现迄今。
- 您可以单击一个框的艺术形象,而无需等待整个搜索完成的那部电影的Netflix的页面。
- 最重要的是,如果Netflix的网站关闭,用户界面保持响应。
异步CTP中引入的新功能,使你几乎没有疼痛的异步编程的所有优点。 你的代码看起来仍然像同步码,但无论你想,你可以指定异步行为 - ,你可以做一个简单,直观的方式。
白皮书,语言规范,博客条目,包含更多的信息的链接,请参见异步编程对C#和Visual Basic或异步CTP初始页面的文档部分。