zoukankan      html  css  js  c++  java
  • .net 异步编程async & await关键字的思考

    C# 5.0引入了两个关键字 async和await,这两个关键字在很大程度上帮助我们简化了异步编程的实现代码,而且TPL中的task与async和await有很大的关系

    思考了一下异步编程中的async & await关键字,对两个关键字尤其是await关键字一直很迷糊,因此深入思考了一下。首先借助的示例是:
    [你必须知道的异步编程]C# 5.0 新特性——Async和Await使异步编程更简单
    这是博客园一个大牛写的,自己也一直关注这个大神,不得不说,博客园大神很多,而且氛围也很好。我引入了其中的示例:

    private async void button1_Click(object sender, EventArgs e)
            {
                var length = AccessWebAsync();
    
                // 这里可以做一些不依赖回复的操作
                OtherWork();
    
                this.textBox1.Text += String.Format("
     回复的字节长度为:  {0}.
    ", 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 += "
    等待服务器回复中.................
    ";
            }

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

    *-*-*-*-------*-------------------------------*-***************-*-*-*-*-增加的内容

    await关键字起到的作用是异步等待,直到异步方法返回了值,否则,调用异步方法的现在是不会继续往下运行的,但是此时的控制权是交到了调用异步方法处(即返回到调用xxxAsync方法的函数处),只是并不会接着await后的代码运行。对比于task.result或是task.wait方法,await关键字起到的是一个异步的功能,而前面的两者都是同步的功能,会阻塞调用方。

  • 相关阅读:
    除adsense外适合英文站的国外广告联盟(4/12/2011更新)
    盛大云和阿里云之云主机初体验
    【行文格式】
    在线PDF阅读&编辑网站一览
    做销售不得不看的20部电影
    VS中的Code Snippet来提高开发效率
    10个免费的javascript富文本编辑器(jQuery and nonjQuery)
    【操作命令】
    SQLServer常见查询问题
    代码検索
  • 原文地址:https://www.cnblogs.com/zhiyong-ITNote/p/6964791.html
Copyright © 2011-2022 走看看