• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > 关于async和await的一些误区实例详解

关于async和await的一些误区实例详解

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了async await,c async await,nodejs async await,js async await,node async await等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

微软官方的MSDN上说async和await是“异步”,但是不少人(包括笔者自己)都有一些误区需要澄清:为什么await语句之后没有执行?不是异步吗?

先举一个示例代码如下:

public partial class Form1 : Form
{
 public async Task Processing()
 {
   await Task.Delay(5000);
   label1.Text = "Succuessful";
 }
 public Form1()
 {
   InitializeComponent();
   
 }
 private async void button1_Click(object sender, EventArgs e)
 {
   await Processing();
   MessageBox.Show("Button's event completed");
 }
}

</div>

很多人(包括笔者)一开始会觉得异步好像类似多线程一样,到await的时候会在后台先开启一个线程执行任务,随后主线程(这里是UI线程)将自动执行后面的部分(即弹出“Button's event completed”的消息框)。

其实这个理解是错误的。async和await的本质其实是“yield return”和“LINQ”的“迭代式”等待。我们应该清楚一点:那就是你写了LINQ语句:

var results = from ……
       select ……;

foreach(var r in results)
{
 ……
}

</div>

当你下断点你会发觉results并不会立即执行,直到使用到results的地方(例子中也就是foreach这里)才会被执行(此时黄色跟踪调试的光棒又会折回到var results……这里,然后等到results执行完毕之后才真正进入foreach进行执行)。

所以,async/await和LINQ的这种“迭代式”的“异步操作”是异曲同工的。只不过async/await本质是返回一个Task而已,而Task又是异步的(因为Task本质就是一个线程),所以真正执行到(使用到async方法的时候)带有await的方法的时候,后台才会真正开启一个线程去执行任务。此时主线程会等待这个Task线程直到其执行完毕(IsComplete属性为True为止)。所以界面是不会卡顿的。

所以,await是Task的异步等待而已,并不是我们所谓的“异步操作”;拿它和LINQ作对比,你会发现LINQ执行顺序和它一致,只不过LINQ没有异步等待(当然没有!又没有开启线程啥的……)。

我们进一步可以这样对比:

LINQ:变量 = LINQ语句(表达式)

   等到使用LINQ变量的时候才折返到LINQ语句处真正执行LINQ语句。

异步等待:变量 = 异步方法

    等到使用await+异步方法的时候才会折返到该异步方法处,开启线程真正执行异步方法,主线程被挂起(但不会造成界面死掉),直至子线程Task任务完全执行完毕为止。

在LINQ中,你如果需要立即执行,可以使用扩展方法:

var results = (from ……
              select ……).ToList();
因为立即使用到了这个LINQ语句,所以会被立即执行。

同样地,异步等待也可以变成类似Wait一样的同步等待:

private async void button1_Click(object sender, EventArgs e)
{
  Processing().GetAwaiter().GetResult();
  MessageBox.Show("Button's event completed");
}

</div>

因为Processing本来就返回Task,当然也可以使用Wait进行同步等待。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 浅谈Async和Await如何简化异步编程(几个实例让你彻底明白)
  • 关于async和await的一些误区实例详解
  • .NET中的async和await关键字使用及Task异步调用实例
  • async and await 的入门基础操作

相关文章

  • 2017-05-28C#采用OpenXml给Word文档添加表格
  • 2017-05-28C#使用DropDownList绑定添加新数据的方法汇总
  • 2017-05-28c#数学表示法(后缀表示法)详解
  • 2017-05-28C# BackgroundWorker用法详解
  • 2017-05-28c#二进制逆序方法详解
  • 2017-05-28Treeview动态添加用户控件传值和取值的实例代码
  • 2017-05-28C# BackgroundWorker组件学习入门介绍
  • 2017-05-2810个C#程序员经常用到的实用代码片段
  • 2017-05-28C# Winform下载文件并显示进度条的实现代码
  • 2017-05-28C#实现改变DataGrid某一行和单元格颜色的方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#中使用DataContractSerializer类实现深拷贝操作示例
    • C#通过经纬度计算2个点之间距离的实现代码
    • c#判断操作系统位数的示例分享
    • 聊一聊C#接口问题 新手速来围观
    • C#实现类似新浪微博长URL转短地址的方法
    • C# 拓展方法的简单实例
    • C#中实现查找mysql的安装路径
    • C#创建windows系统用户的方法
    • C#多线程编程之使用ReaderWriterLock类实现多用户读与单用户写同步的方法
    • C#读写操作app.config中的数据应用介绍

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有