在WPF中开始Async的学习

13 篇文章 0 订阅
5 篇文章 0 订阅

 

简介

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初始页面的文档部分。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值