介绍
这篇文章主要介绍了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中异步和等待关键字的用法”这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!