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
" 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的新特性之全新的异步编程模型的详细内容...