好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#5.0的新特性之全新的异步编程模型

C#5.0的新特性之全新的异步编程模型

1.异步方法的实现原理

异步方法不需要多线程,因为一个异步方法并不是运行在一个独立的线程中的。

异步方法运行在当前同步上下文中,只有激活的时候才占用当前线程的时间。

异步模型采用时间片轮转来实现。

2.使用异步编程模型的优势:

避免性能瓶颈,提升应用程序的整体响应性。

3.关键字

   全新的异步编程模型使用“async”和“await”关键字来编写异步方法

async:用来标识一个方法,lambda表达式,或者一个匿名方法是异步的;

await:用来标识一个异步方法应该在此处挂起执行,直到等待的任务完成,于此同时,控制权会移交给异步方法的调用方。

4.异步方法的参数和返回值

异步方法的参数: 不能使用“ref”参数和“out”参数,但是在异步方法内部可以调用含有这些参数的方法

异步方法的返回类型:

  Task<TResult>:Tresult为异步方法的返回值类型。

  Task:异步方法没有返回值。

  void:主要用于事件处理程序(不能被等待,无法捕获异常)。

5.异步方法的命名规范

*异步方法的方法名应该以Async作为后缀

*事件处理程序,基类方法和接口方法,可以忽略此命名规范:

*例如: startButton_Click不应重命名为startButton_ClickAsync

 

6.一个Demo

  1   <  Window
   2           xmlns  ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  3           xmlns:x  ="http://schemas.microsoft.com/winfx/2006/xaml" 
  4           xmlns:d  ="http://schemas.microsoft.com/expression/blend/2008"   xmlns:mc  ="http://schemas.openxmlformats.org/markup-compatibility/2006"   mc:Ignorable  ="d"   x:Class  ="AsyncSample.MainWindow" 
  5           Title  ="Control Flow Trace"   Height  ="350"   Width  ="592"  > 
  6       <  Grid  > 
  7           <  Button   x:Name  ="startButton"   Content  ="Start&#xa;"   HorizontalAlignment  ="Left"   Margin  ="250,10,0,0"   VerticalAlignment  ="Top"   Width  ="75"   Height  ="24"    Click  ="startButton_Click"   d:LayoutOverrides  ="GridBox"  /> 
  8           <  TextBox   x:Name  ="resultsTextBox"   HorizontalAlignment  ="Left"   TextWrapping  ="Wrap"   VerticalAlignment  ="Bottom"   Width  ="576"   Height  ="265"   FontFamily  ="Lucida Console"   FontSize  ="10"   VerticalScrollBarVisibility  ="Visible"   Grid.ColumnSpan  ="3"  /> 
  9       </  Grid  > 
 10   </  Window  > 

  1   using   System;
   2   using   System.Collections.Generic;
   3   using   System.Linq;
   4   using   System.Text;
   5   using   System.Threading.Tasks;
   6   using   System.Windows;
   7   using   System.Windows.Controls;
   8   using   System.Windows.Data;
   9   using   System.Windows.Documents;
  10   using   System.Windows.Input;
  11   using   System.Windows.Media;
  12   using   System.Windows.Media.Imaging;
  13   using   System.Windows.Navigation;
  14   using   System.Windows.Shapes;
  15   using   System.Net.Http;
  16  
 17   namespace   AsyncSample
  18   {
  19       ///   <summary> 
 20       ///   MainWindow.xaml 的交互逻辑
  21       ///   </summary> 
 22       public   partial   class   MainWindow : Window
  23       {
  24           public   MainWindow()
  25           {
  26               InitializeComponent();
  27              
 28           }
  29           private   async   void  startButton_Click( object   sender, RoutedEventArgs e)
  30           {
  31               //   1 
 32              Task< string > getLengthTask =  AccessTheWebAsync();
  33  
 34               //   4 
 35               string  contentLength =  await   getLengthTask;
  36  
 37               //   6 
 38              resultsTextBox.Text +=
 39                  String.Format( "  \r\nLength of the downloaded string: {0}.\r\n  "  , contentLength);
  40           }
  41  
 42  
 43           async  Task< string >  AccessTheWebAsync()
  44           {
  45               //   2 
 46              HttpClient client =  new   HttpClient();
  47              Task< string > getStringTask =
 48                  client.GetStringAsync(  http://www.cnblogs.com   );
  49  
 50               //   3                 
 51               string  urlContents =  await   getStringTask;
  52  
 53               //   5 
 54               return   urlContents;
  55           }
  56       }
  57  }

7.异步方法的执行序列 1:  进入startButton_Click方法

           调用 AccessTheWebAsync.

2:   进入 AccessTheWebAsync

           调用HttpClient.GetStringAsync.

 

3:  回到 AccessTheWebAsync

           任务getStringTask开始.

           等待getStringTask & 返回一个Task<int>实例给startButton_Click.

4:  回到startButton_Click

           任务getLengthTask开始

           等待getLengthTask.

5:  回到AccessTheWebAsync

           任务getStringTask已经完成.

           执行return语句.

           退出AccessTheWebAsync.

6:   回到startButton_Click

           任务getLengthTask已经完成.

           AccessTheWebAsync 的结果被存储到contentLength.

           显示contentLength 然后退出.

 

分类:  c#

标签:  C# ,  vs2012

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于C#5.0的新特性之全新的异步编程模型的详细内容...

  阅读:41次