HTML5技术

C#之异步编程 - 郑隆2015

字号+ 作者:H5之家 来源:博客园 2015-12-20 19:43 我要评论( )

1 异步编程的重要性 C#5.0最重要的改进是提供了更强大的异步编程,C#5.0仅增加两个关键字Async和Await,使用异步编程,方法调用是后台运行(通常在线程和任务的帮助下),并且不会阻塞调用线程。 2 异步模式 从.net1.0开始就提供了异步特性,而且.NET Framew

1 异步编程的重要性

  C#5.0最重要的改进是提供了更强大的异步编程,C#5.0仅增加两个关键字Async和Await,使用异步编程,方法调用是后台运行(通常在线程和任务的帮助下),并且不会阻塞调用线程。

2 异步模式

  从.net1.0开始就提供了异步特性,而且.NET Framework的许多类都实现了一个或多个异步模式(委托也实现了异步模式)。因为在WIndows From和WPF中用异步模式更新界面比较复杂,所以在2.0中提供了基于事件的异步模式。现在在4.5中推出了另外一种新的方式来实现异步编程:基于任务的异步模式。这种模式是基于4.0中新增的Task类型,和一个利用Async和Await关键字的编译器功能。

2.1 同步调用

s= wc.DownloadString(); 

  运行该代码,程序一直在等待DownloadString的完成,在这种情况下使用异步非常有必要的。

2.2异步模式

使用异步模式是进行异步调用的方式之一,实现异步模式定义BeginXXX和EndXXX方法。如果有一个同步方法DownloadStrring,异步方法将转化成了两个方法BeginDownloadString和EndDownloadString方法。BeginXXX方法接受同步方法的所有输入的参数,并且还定义了一个AsyncCallBack参数,用于接收在异步方法执行完毕后的被调用的委托,该方法返回一个IAsyncResult,用于验证调用是否已经完成,并且一直等待,直到方法的执行完毕。EndXXX方法同步方法的所有的输出参数,并按照同步方法的返回类型来返回结果。WebClient类没有实现异步模式,但可以用HttpWebRequest来代替

); 2 IAsyncResult result= req.BeginGetResponse("",); 3 req.EndGetResponse();

异步模式的优势是使用委托功能就能实现异步编程,不用改变程序的行为,也不会阻塞界面的操作。

2.3基于事件的异步模式

  基于事件的异步模式定义了一个带有"Aysnc"后缀的方法。异步方法完成时不是定义被调用的委托,而是定义事件。

1 WebClient client = new WebClient(); 2 client.DownloadStringCompleted += (sender, e1) => { }; ));

基于事件的异步方式的优势是易用。

2.4基于任务的异步模式

Fun() 2 { 3 WebClient client = new WebClient(); ); 5 }

现在代码简单多了,并且没有阻塞。

3 异步编程的基础

  async和await关键字只是编译器功能,编译器会用Task创建代码。

3.1创建任务

Greeting(string name) 2 { 3 Thread.Sleep(2000); .Format(, name); 5 } 6 static Task<string> GreetingAsync() 7 { 8 return Task.Run<string>(()=> { return Greeting(name); }); 9 }

 

3.2调用异步方法

  可以使用Await关键字来调用返回任务的异步方法GreetingAsync,使用Await关键字需要使用Async修饰声明的方法。在完成GreetingAsync方法前该方法内的其它代码不会被执行。

CallWithAsync() 2 { ); 4 Console.WriteLine(result); 5 }

如果异步方法的结果不传递给变量,也可以直接在参数中使用Await关键字。

CallWithAsync2() 2 { )); 4 }

Async修饰符只能用于返回Task和void的方法。不能用于程序的入口。 3.3延续任务

Task类的ContinueWith方法定义了任务完成后将要调用的代码。

CallerWithContinuationTask() 2 { ); 4 t1.ContinueWith(t => { string result = t.Result; Console.WriteLine(result); }); 5 }

  3.4使用多个异步方法

在一个异步方法中,可以调用不止一个异步方法。

MultipleAsyncMethods() 2 { ); ); +,s1,s2); 6 }

Task.WhenAll组合器,可以让你等待直到两个任务都完成。

MultipleAsyncMethodsWithCombinators1() 2 { ); ); 5 await Task.WhenAll(t1,t2); + , t1.Result, t2.Result); 7 }

Task的WhenAll方法是在所有传入的任务都完成了才返回Task,而WhenAny是在其中的一个任务已完成就会返回Task。

3.5转换异步模式

并非.NET Freamwork的所有的类在4.5中都引入了新的异步方法。

Func<string, string> greetingInvoker = Greeting; IAsyncResult BeginGreeting(string name,AsyncCallback callback,object state) 4 { 5 return greetingInvoker.BeginInvoke(name, callback, state); 6 } EndGreeting(IAsyncResult ar) 8 { 9 return greetingInvoker.EndInvoke(ar); 10 } ConvertingAsyncPattern() 12 { , null); 14 Console.WriteLine(s); 15 }

4 错误处理

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 使用Docker分分钟启动常用应用 - 编程玩家

    使用Docker分分钟启动常用应用 - 编程玩家

    2017-04-10 14:00

  • 我,编程和大学 - 外婆的彭湖湾

    我,编程和大学 - 外婆的彭湖湾

    2017-04-09 17:04

  • 初学编程一周的感想 - 陈老仁

    初学编程一周的感想 - 陈老仁

    2017-03-20 10:01

  • C#异步的世界【下】 - 农码一生

    C#异步的世界【下】 - 农码一生

    2017-03-06 17:06

网友点评
a