1.前提

熟练掌握Task并行编程。

2.用Task并行解释async和await异步

因为控制台有多线程操作的优化,因此这里选择winform来做示例。

测试代码如下所示:

有三个textbox,一个button

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms; namespace TestAsyncAwait
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Button1_Click(object sender, EventArgs e)
{
TestAsync(); textBox3.Text = "333";
} private async void TestAsync()
{
//Thread.Sleep(5000);//依然阻塞 await Task.Run(() =>
{
Thread.Sleep(2000); this.Invoke((EventHandler)delegate { textBox1.Text = "1"; }); Thread.Sleep(2000); }); this.Invoke((EventHandler)delegate { textBox2.Text = "22"; });
} }
}

显示的顺序是:333,1,22

如果在设置textbox显示内容之前,通过Thread.CurrentThread.ManagedThreadId属性来获取当前线程ID。

可以得到textbox3所在为主线程,await之前也在主线程,await中和await后为新线程,这也是为什么在textbox1和textbox2的text加上invoke的原因。

简单来时,实际上async和await就是表示,遇到await之后,函数直接返回,然后剩下的部分等同于在一个新线程中运行。

使用Task并行编程的解释代码如下,将button按钮的click事件与TestAsync函数统一成TestTask函数

        private void TestTask()
{
Task.Run(() =>
{
Task task = Task.Run(() =>
{
Thread.Sleep(2000); this.Invoke((EventHandler)delegate { textBox1.Text = "1"; }); Thread.Sleep(2000);
}); Task.WaitAll(task); this.Invoke((EventHandler)delegate { textBox2.Text = "22"; });
}); textBox3.Text = "333";
}

当然,上述代码也不完全等价async和await,只不过在实现功能上来说,没有差别。

具体的差别表现为,waitall之前的线程与waitall之后所在线程不在同一个线程。这个差别也揭示了async和await的另外一个优势,那就是节约线程,内部实现了线程池优化。

3.总结

如果你懂得Task并行编程或者Thread多线程编程,其实async和await的原理是不难的,没有什么神乎其神的操作。

async和await作为C#异步编程的语法糖,具有无可匹敌的优势,但是很多时候很多人不能理解用法,相比较而言直接使用Task并行编程会更加易懂。

我的建议是,如果是新项目可以使用async和await,让自己的代码更简洁;如果是老项目维护,建议还是使用Task的方式维护,容易读懂。

彻底搞懂C#异步编程 async和await的原理的更多相关文章

  1. .NET4.5 异步编程 async和await

    msdn介绍:https://msdn.microsoft.com/zh-cn/library/hh191443.aspx 其实很简单,标记了async的方法为异步方法,从方法的左大括号开始同步执行, ...

  2. C#异步编程(async and await)及异步方法同步调用

    1.什么是异步? 异步操作通常用于执行完成时间可能较长的任务,如打开大文件.连接远程计算机或查询数据库=异步操作在主应用程序线程以外的线程中执行.应用程序调用方法异步执行某个操作时,应用程序可在异步方 ...

  3. 异步编程- async和await

    使用目的 避免阻塞主线程 提高程序响应能力 C#中使用 C# 中的 Async 和 Await 关键字是异步编程的核心. 疑惑 The async and await keywords don't c ...

  4. C#中的异步编程Async 和 Await

    谈到C#中的异步编程,离不开Async和Await关键字 谈到异步编程,首先我们就要明白到底什么是异步编程. 平时我们的编程一般都是同步编程,所谓同步编程的意思,和我们平时说的同时做几件事情完全不同. ...

  5. .net异步编程async和await的讨论收获

    微软官方描述: C# 5 引入了一种简便方法,即异步编程.此方法利用了 .NET Framework 4.5 及更高版本..NET Core 和 Windows 运行时中的异步支持. 编译器可执行开发 ...

  6. C#异步编程----async和await组合的写法

    微软示例: private async void StartButton_Click(object sender, RoutedEventArgs e) { // ExampleMethodAsync ...

  7. 抓住异步编程async/await语法糖的牛鼻子: SynchronizationContext

    长话短说,本文带大家抓住异步编程async/await语法糖的牛鼻子: SynchronizationContext 引言 C#异步编程语法糖async/await,使开发者很容易就能编写异步代码. ...

  8. 异步编程Async/await关键字

    异步编程Async \await 关键字在各编程语言中的发展(出现)纪实. 时间 语言版本 2012.08.15 C#5.0(VS2012) 2015.09.13 Python 3.5 2016.03 ...

  9. .net 异步编程async & await关键字的思考

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

随机推荐

  1. 微信access_token缓存与更新

    由于Access Token有效期只有7200秒,而每天调用获取的次数只有2000次,所以需要将Access Token进行缓存来保证不触发超过最大调用次数.另外在微信公众平台中,绝大多数高级接口都需 ...

  2. LVS+keepalived简单搭建(二)

    在LVS1的基础上进行搭建 https://www.cnblogs.com/hikoukay/p/12860476.html keeplived主机 用node01,node04两台 先清掉原先nod ...

  3. Solon 1.8.3 发布,云原生微服务开发框架

    相对于 Spring Boot 和 Spring Cloud 的项目 启动快 5 - 10 倍 qps 高 2- 3 倍 运行时内存节省 1/3 ~ 1/2 打包可以缩小到 1/2 ~ 1/10(比如 ...

  4. SAP Picture Control(图片加载)

    Screen display 效果 源代码 program sap_picture_demo. set screen 200. TYPE-POOLS cndp. ******************* ...

  5. NC21181 重返小学

    NC21181 重返小学 题目 题目描述 ​ 时光依旧,岁月匆匆.转眼间,曾经的少年郭嘉烜已经长大成人,考上了一所优秀的大学--兰州大学.在经历了一年来自牛顿.莱布尼茨.拉普拉斯的精神洗礼后,他终于决 ...

  6. Django数据库性能优化之 - 使用Python集合操作

    前言 最近有个新需求: 人员基础信息(记作人员A),10w 某种类型的人员信息(记作人员B),1000 要求在后台上(Django Admin)分别展示:已录入A的人员B列表.未录入的人员B列表 团队 ...

  7. gnet: 一个轻量级且高性能的 Go 网络框架 使用笔记

    一个偶然的机会接触到了golang,被它的高并发传说所吸引,就开始学这门语言,越学感觉越有意思^_^ 注册了博客园这么多年,第一次写东西,年纪大了,脑子不好使了,就得写下来,记下来,为了自己以后查阅, ...

  8. 实时数据引擎系列(五): 关于 SQL Server 与 SQL Server CDC

      摘要:在企业客户里, SQL Server 在传统的制造业依然散发着持久的生命力,SQL Server 的 CDC 复杂度相比 Oracle 较低, 因此标准的官方派做法就是直接使用这个 CDC ...

  9. 4种Kafka网络中断和网络分区场景分析

    摘要:本文主要带来4种Kafka网络中断和网络分区场景分析. 本文分享自华为云社区<Kafka网络中断和网络分区场景分析>,作者: 中间件小哥. 以Kafka 2.7.1版本为例,依赖zk ...

  10. java导出excel单sheet超过65535数据报错拆分多sheet导出

    在开发过程中,数据导出excel的功能很常见,数据少,到没问题,一旦超过65535条数据就会报错,因此可以考虑导出多个sheet来解决,代码如下: private static void export ...