c# 5.0中异步和等待关键字的用法

  介绍

这篇文章主要介绍了c# 5.0中异步和等待关键字的用法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。

c# 5.0引入了两个关键字异步和等待,这两个关键字在很大程度上帮助我们简化了异步编程的实现代码,而且TPL中的任务与异步和等待有很大的关系

private  async  void  button1_Click (object ,发送方,EventArgs  e)   ,,,,,,,{   ,,,,,,,,,,,var  length =, AccessWebAsync ();      ,,,,,,,,,,,//,这里可以做一些不依赖回复的操作   ,,,,,,,,,,,OtherWork ();      ,,,,,,,,,,,this.textBox1.Text  +=, String.Format (“\ n 回复的字节长度为:,,{0}。\ r \ n",, await 长度);   ,,,,,,,,,,,this.textBox2.Text =, Thread.CurrentThread.ManagedThreadId.ToString ();   ,,,,,,,}      ,,,,,,,private  async  Task, AccessWebAsync ()   ,,,,,,,{   ,,,,,,,,,,,MemoryStream  content =, new  MemoryStream ();      ,,,,,,,,,,,//,对MSDN发起一个Web请求   ,,,,,,,,,,,HttpWebRequest  webRequest =, WebRequest.Create (“http://msdn.microsoft.com/zh-cn/"), as  HttpWebRequest;   ,,,,,,,,,,,if  (webRequest  !=, null)   ,,,,,,,,,,,{   ,,,,,,,,,,,,,,,//,返回回复结果   ,,,,,,,,,,,,,,,using  (WebResponse  response =, await  webRequest.GetResponseAsync ())   ,,,,,,,,,,,,,,,{   ,,,,,,,,,,,,,,,,,,,using  (Stream  responseStream =, response.GetResponseStream ())   ,,,,,,,,,,,,,,,,,,,{   ,,,,,,,,,,,,,,,,,,,,,,,await  responseStream.CopyToAsync(内容);   ,,,,,,,,,,,,,,,,,,,}   ,,,,,,,,,,,,,,,}   ,,,,,,,,,,,}      ,,,,,,,,,,,this.textBox3.Text =, Thread.CurrentThread.ManagedThreadId.ToString ();   ,,,,,,,,,,,return  content.Length;   ,,,,,,,}      ,,,,,,,private  void  OtherWork ()   ,,,,,,,{   ,,,,,,,,,,,this.textBox1.Text  +=,“\ r \ n等待服务器回复中................. \ n";   ,,,,,,,}

异步是同步执行程序,而等待起到的则是划分片段以及挂起调用方的作用,并不会创建新的线程,根据大神的分析:

在等待关键字出现的前面部分代码和后面部分代码都是同步执行的(即在调用线程上执行的,也就是GUI线程,所以不存在跨线程访问控件的问题),等待关键处的代码片段是在线程池线程上执行。

在上面的代码中,调用了整封装的GetResponseAsync等方法从而不阻塞当前UI线程,等待的确不会创建新的线程,但是就在这里而言,等待表达式中的确创建了新的线程——GetResponseAsync所做的。以至于造成了表面同步的假象。我之前写过一篇文章
c#异步与等待异步编程学习笔记

等待关键字与任务有莫大的关联,从其特定的返回值就可以看出来,更深层次的等待与任务的continuewith函数应该是等效的。因此,用异步,等待关键字实现异步要么调用整柜封装好的异步方法。

感谢你能够认真阅读完这篇文章,希望小编分享的“c# 5.0中异步和等待关键字的用法”这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

c# 5.0中异步和等待关键字的用法