在WPF中开始Async的学习

 

简介

Visual Studio中异步CTP (SP1刷新)的新功能预览,让你写异步方案,只是比现在的.NET Framework的方法麻烦一点。 您可以编写异步代码,它与同步代码看起来非常像,可以让编译器处理的回调函数。

本演练开始同步WPF应用程序查找并显示在Netflix的目录。 演练显示如何更改使用的CTP功能的同步解决方案,以异步的解决方案。 

该应用程序使用打开数据协议(OData的)API来查询,在您指定的年发行的电影Netflix的目录。 有关OData的信息,请参阅Netflix website.。 

先决条件

为了完成本演练,您必须安装带有SP1的Microsoft Visual Studio 2010 ,并安装异步CTP在计算机上。

要打开异步CTP初始页面

  1.  转到我的文档\ Microsoft Visual Studio中异步的CTP \文件。
  2. 双击Readme.hta。
  3. 或者,单击开始  所有程序,Visual Studio的异步CTP,然后异步自述 

要测试一个应用程序的同步版本

  1. 在异步CTP初始页面,请在C#VB入门入门部分在Visual Studio中打开项目。
  2. 按Ctrl + F5运行该应用程序。
  3. 出现下面的窗口。

  4. 发行年 “框中键入一年,然后单击” 搜索 “按钮。 应用程序搜索Netflix的目录,在这一年发行的电影,显示每个标题“框艺术”,并显示匹配的总数。

  5. 输入最近一年,然后再次单击“ 搜索 ”按钮。 请注意同步的解决方案中的下列行为:
    • 显示不改变,直到程序结束。 结果“面板不清零,显示任何新的箱子艺术和搜索过程右上方状况文本不报告分类汇总。 您会看到只在最后的冠军数量。
    • 更糟糕的是,程序运行时,你不能操作它。 您不能调整大小,移动或最小化窗口,你不能滚动, 您不能使用关闭按钮(在右上角的红色区域中的X),以结束该程序,如果你厌倦了等待结果。 即使关闭Visual Studio中,没有任何效果,这时候你需要等待
    • 如果Netflix的网站是出于某种原因,UI冻结,而程序等待时间,再次,你需要等待。

要启动异步解决方案的转换,增加了CTP的参考

  1. 项目菜单上,单击添加引用  添加引用对话框。
  2. 在“ 浏览 ”选项卡,导航到异步CTP样品的下载位置。 默认情况下,下载位置是我的文档\ Microsoft Visual Studio中异步的CTP \ SAMPLES。
  3. 点击AsyncCtpLibrary.dll“,然后单击” 确定 “ “。

要转换的代码异步应用程序

正如你看到程序“,以测试一个应用程序的同步版本,”搜索应用程序,在指定的一年上映的电影的Netflix的目录。 它显示每个影片相关的框艺术。 箱子艺术是那部电影的Netflix的网页链接。

在应用程序的两种方法涉及从网上检索信息,这些都是你需要改变转换,从一个同步的解决方案异步解决方案的方法。

  • LoadMovies套舞台上,然后反复调用QueryMovies一次获取XML数据,10(pageSize的变量的值)的电影。 它要求DisplayMovies显示结果。
  • QueryMovies访问Web检索关于未来的10部电影信息。 从在结果中的每个条目,挑选出显示使用领域:标题,URL,和箱子艺术。

下面的步骤转换这两个同步方法的异步方法。 当你做出每一个变化,一个错误信息引导您到​​下一个。

  1. MainPage.xaml中 ,在解决方案资源管理器右键单击,然后单击查看代码以打开代码编辑器中的代码。
  2. QueryMovies是从官网上下载直接下载的,所以它是异步解决方案: 在Visual Basic中,单击“ 全部 ”选项卡。 



    选择最后一个,DownloadStringTaskAsync,异步,基于任务的异步CTP提供WebClient的扩展方法。 如果您没有看到下拉列表的方法,只需键入它。
  3. 为了使调用异步方法DownloadStringTaskAsync,你必须使QueryMovies成为异步方法。 

    首先,在C#中添加await Await 在Visual Basic中,添加在DownloadStringTaskAsync的前面,如下面的代码所示。
 
 // C# string data = await client.DownloadStringTaskAsync(new Uri(url)); 


 ' Visual Basic Dim data As String = Await client.DownloadStringTaskAsync(New Uri(url)) 


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 修饰符。

 
 // C# async Movie[] QueryMovies(int year,int first,int count) { var client = new WebClient(); 


 ' Visual Basic Async Function QueryMovies(year As Integer, first As Integer, count As Integer) As Movie() Dim client As New WebClient 


  1. 异步方法的返回类型必须void 任务,或在C# 中的任务<T>。 在Visual Basic中,方法必须是一个Sub ,或一个Function  ,返回Task Task (T)的。 在C#里边Movie[] Task<Movie[]> ,在VB里边是从Movie()Task(Of Movie())
 
 // C# async Task<Movie[]> QueryMovies(int year,int first,int count) 


 ' Visual Basic Async Function QueryMovies(year As Integer, first As Integer, count As Integer) As Task(Of Movie()) 


  1. 添加以下 using指令或Imports语句在代码文件的顶部,以建立Task的任务定义。
 
 // C# using System.Threading.Tasks; 


 ' Visual Basic Imports System.Threading.Tasks 


  1. 按照惯例,异步方法应以“异步”结尾的名称。 更改方法名称QueryMovies QueryMoviesAsync。
 
 // C# async Task<Movie[]> QueryMoviesAsync(int year,int first,int count) 


 ' Visual Basic Async Function QueryMoviesAsync(year As Integer, first As Integer, count As Integer) As Task(Of Movie()) 


  1. QueryMovies转换QueryMoviesAsync完成。 下一步,申请LoadMovies相同的过程,这就要求现在的异步方法QueryMoviesAsync。 对于这种方法,你不必改变返回值的类型,因为该方法不返回一个有意义的值。

    首先,改变LoadMoviesQueryMovies QueryMoviesAsync调用的方法名称。

 
 // C# var movies = QueryMoviesAsync(year,imageCount,pageSize); 


 ' Visual Basic Dim movies = QueryMoviesAsync(year,imageCount,pageSize) 


  1. 其次,因为QueryMoviesAsync是一个异步方法,在C添加await  或Visual Basic中的Await 在前面的调用。
 
 // C# var movies = await QueryMoviesAsync(year,imageCount,pageSize); 


 ' Visual Basic Dim movies = Await QueryMoviesAsync(year,imageCount,pageSize) 


  1. 第三,增加异步异步修饰符的LoadMovies定义。
 
 // C# async void LoadMovies(int year) 


 ' Visual Basic Async Sub LoadMovies(year As Integer) 


  1. 最后,在C#中使用重构,重命名或在Visual Basic 改变 LoadMovies  LoadMoviesAsync 。
 
 // C# async void LoadMoviesAsync(int year) 


 ' Visual Basic Async Sub LoadMoviesAsync(year As Integer) 


这就是它! 你叫一个不同的WebClient方法,添加using指令 Imports语句,添加了几个关键字,更名为两种方法,并修改了返回类型,和你有一个异步解决方案。

运行和测试程序

  1. 按Ctrl + F5运行该应用程序。
  2. 从程序重复步骤4和5的测试“,以测试一个应用程序的同步版本。” 注意改善异步行为提供:
    • 结果不都发生在程序结束的同时。 例如,显示面板的清除只要你点击“ 搜索 ”按钮,并框艺术是不是所有在同一时间显示。 你首先看到的结果,只要你点击“ 搜索 ”按钮。
    • 您可以移动或调整窗口大小,或在滚动的过程,而运行。
    • 通过点击“关闭”按钮(在右上角的红色区域中的X),您可以结束在任何时候搜索。
    • 在搜查过程中的进展情况的文字更新,显示你有多少匹配的标题已经发现迄今。
    • 您可以单击一个框的艺术形象,而无需等待整个搜索完成的那部电影的Netflix的页面。
    • 最重要的是,如果Netflix的网站关闭,用户界面​​保持响应。

异步CTP中引入的新功能,使你几乎没有疼痛的异步编程的所有优点。 你的代码看起来仍然像同步码,但无论你想,你可以指定异步行为 - ,你可以做一个简单,直观的方式。

白皮书,语言规范,博客条目,包含更多的信息的链接,请参见异步编程对C#和Visual Basic或异步CTP初始页面的文档部分。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章