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线程阻塞.

更多相关文章

  1. C# 多线程--线程池的详细介绍
  2. C#中多线程之Thread类详解
  3. C#线程控制的实例详解
  4. 使用ConcurrentDictionary多线程同步字典集合实例详解
  5. c#中关于多线程创建对象的示例分享
  6. C#多线程之Semaphore的使用详解
  7. C# WinForm跨线程访问控件的图文详解
  8. C++11多线程编程基础入门
  9. C++解决方法:多线程同步经典案例之生产者消费者问题

随机推荐

  1. 三十一、关于android camera setParamete
  2. Android 中文API (66) ―― BluetoothClass
  3. Android开发中RxJava-SQLBrite实时刷新UI
  4. android FastJson的使用
  5. Android(安卓)获取WIFI MAC地址的方法
  6. Android 开发者必备的十个工具(下)
  7. Android初学习 - android:sharedUserId="
  8. android多播
  9. 【Android】Android 联系人数据库浅析之
  10. Android SQLite数据库操作实例