本文摘自PHP中文网,作者零下一度,侵删。
C# 5.0引入了两个关键字 async和await,这两个关键字在很大程度上帮助我们简化了异步编程的实现代码,而且TPL中的task与async和await有很大的关系1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | private async void button1_Click( object sender, EventArgs e)
{
var length = AccessWebAsync();
OtherWork();
this .textBox1.Text += String.Format( "\n 回复的字节长度为: {0}.\r\n" , await length);
this .textBox2.Text = Thread.CurrentThread.ManagedThreadId.ToString();
}
private async Task< long > AccessWebAsync()
{
MemoryStream content = new MemoryStream();
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(content);
}
}
}
this .textBox3.Text = Thread.CurrentThread.ManagedThreadId.ToString();
return content.Length;
}
private void OtherWork()
{
this .textBox1.Text += "\r\n等待服务器回复中.................\n" ;
}
|
async是同步执行程序,而await起到的则是划分片段以及挂起调用方的作用,并不会创建新的线程,根据大神的分析:
在await关键字出现的前面部分代码和后面部分代码都是同步执行的(即在调用线程上执行的,也就是GUI线程,所以不存在跨线程访问控件的问题),await关键处的代码片段是在线程池线程上执行。
在上面的代码中,调用了FCL封装的GetResponseAsync等方法从而不阻塞当前UI线程,await的确不会创建新的线程,但是就在这里而言,await表达式中的确创建了新的线程――GetResponseAsync所做的.以至于造成了表面同步的假象。我之前写过一篇文章
C#async与await异步编程学习笔记
await关键字与Task有莫大的关联,从其特定的返回值就可以看出来,更深层次的await与task的continuewith函数应该是等效的.因此,用async & await关键字实现异步要么调用FCL封装好的异步方法,要么我们就自己调用task来创建新的线程分担UI线程的任务以防止UI线程阻塞.
以上就是C# 5.0引入了两个关键字 --async和await的详细内容!
相关阅读 >>
浅谈.net中的浅拷贝和深拷贝
关于.net 3.5中的委托实例
c#中发送邮件的实现方法详解
c#线程控制的实例详解
c#中datetime与时间戳转换的实例代码
c#中引用类型之特例string的详细介绍
c#中如何使用sendmessage?
.net winform的gdi双缓冲的实现方法_实用技巧
c# 利用委托进行异步处理实例代码
详细介绍.net并行与多线程学习基础
更多相关阅读请进入《async》频道 >>
清华大学出版社
作者:[美]克里斯琴·内格尔(Christian Nagel)著。出版时间:2019年3月。
转载请注明出处:木庄网络博客 » C# 5.0引入了两个关键字 --async和await