c# 5.0引入了两个关键字 async和await,这两个关键字在很大程度上帮助我们简化了异步编程的实现代码,而且tpl中的task与async和await有很大的关系
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();
// 对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(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和await02-21
- .net 2.0中的委托实例讲解02-21
- .net 1.x中的委托实例详解02-21
- 介绍一个力软敏捷开发框架02-21
- 什么是委托?总结.net中重要的特性委托02-21
- 对wcf的理解--实现计算器功能02-21
- C# 多线程--线程池的详细介绍02-21
- .NET Core 和 .NET .Framework 相比哪个速度快?02-21
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
