C# 5.0引入了两个关键字 --async和await


本文摘自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();

 

            // 对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和await的详细内容!

相关阅读 >>

c#使用aforge实现摄像头录像功能的案例

c# 数组作为参数传递出现的问题解决

c#实现表格隔行换色

javascript client 如何获取 telerik radgrid的值

c#中关于async与await的使用详解

c#中匿名对象与var以及动态类型 dynamic的详解

c#中使用反射以及特性简化的实例代码

c#实现杨辉三角的示例

c#开发微信门户及应用(二)之微信消息处理和应答的图文代码教程

介绍c#中的堆和栈

更多相关阅读请进入《async》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...