.net 关于Task.Run 和 Async await的执行顺序
一直捋不清楚用Task.Run异步的执行关系,网上找的些说明写得也有点复杂,所以自己做实验测一下。
直接上代码
这个是加await
private static void TestFun()
{
Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} Test start!");
MainTask();
Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} Test End !");
} private static async Task MainTask()
{
Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} MainTask Start !");
Thread.Sleep(2000);
//await or not
await Task.Run(() =>
{
Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} Subtask Start !");
Thread.Sleep(2000);
Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} Subtask End !");
});
Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} MainTask End !");
}
执行结果

这里TestFun调用async异步方法Maintask,2s后遇到await,马上回去执行TestFun中后面的操作“Test End”,同时await里的Subtask也开始执行,并且Subtask完成后才显示“MainTask end”。
再去掉await
private static void TestFun()
{
Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} Test start!");
MainTask();
Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} Test End !");
} private static async Task MainTask()
{
Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} MainTask Start !");
Thread.Sleep(2000);
//await or not
Task.Run(() =>
{
Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} Subtask Start !");
Thread.Sleep(2000);
Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} Subtask End !");
});
Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} MainTask End !");
Thread.Sleep(1000);
}
结果

这里顺序就不一样了,进入MainTask 2s后,执行Subtask的Task,并且开始执行Subtask之后的内容,再之后才跳出MainTask显示“End”。
为了便于理解,我在“MainTask End”下面多sleep了1s,为了区分上一个测例因为遇到await Task跳出的情况。
简单总觉一下:
调用async异步方法的线程,遇到await,马上回去继续执行后面的操作,而async异步方法里面,则是执行完任务,再继续执行await关键字后面的内容,相当于await关键字后面内容,是在回调中完成。
最后回顾一下,写的基本和其他人一样难懂,但自己是捋清楚了,也不亏,哈哈。
.net 关于Task.Run 和 Async await的执行顺序的更多相关文章
- setTimeout、Promise、Async/Await 的执行顺序
问题描述:以下这段代码的执行结果 async function async1() { console.log('async1 start'); await async2(); console.log( ...
- JS中的async/await的执行顺序详解
虽然大家知道async/await,但是很多人对这个方法中内部怎么执行的还不是很了解,本文是我看了一遍技术博客理解 JavaScript 的 async/await(如果对async/await不熟悉 ...
- async await 的执行
async await的执行 注意:本次代码仅在 Chrome 73 下进行测试. start 不了解 async await 的,先去看阮一峰老师的文章async 函数. 先来看一道头条的面试题,这 ...
- 详解promise、async和await的执行顺序
1.题目和答案 一道题题目:下面这段promise.async和await代码,请问控制台打印的顺序? async function async1(){ console.log('async1 sta ...
- 理解 async/await 的执行
这是一篇简单的短文章,方便理解. 开局先丢官宣:sec-async-function-definitions 这个链接是对 await 的解释,解释了它的执行. await 的执行意味着(官宣巴拉巴拉 ...
- node.js async/await 继发执行与并发执行
async/await 继发执行与并发执行,看如何控制 两个异步函数 foo bar function foo() { return new Promise((resolve, reject) =&g ...
- 理解Task和和async await
本文将详解C#类当中的Task,以及异步函数async await和Task的关系 一.Task的前世今生 1.Thread 一开始我们需要创建线程的时候一般是通过Thread创建线程,一般常用创建线 ...
- async await promise 执行时序
先用一个例子来说明async await promise的执行顺序 console.log('start'); async function test(){ console.log('111'); a ...
- async和await的执行顺序问题
说明 : 要了解执行顺序,所需要的知识是了解浏览器js运行机制,以及微任务和宏任务的先后顺序.如果你明白了宏任务.微任务,请往下看: async function async1 () { consol ...
随机推荐
- Homebrew安装环境
p.p1 { margin: 0; font: 11px Menlo; color: rgba(0, 0, 0, 1) } span.s1 { font-variant-ligatures: no-c ...
- 详解AOP——用配置文件的方式实现AOP
AOP概念 1.AOP:面向切面(方面)编程,扩展功能不修改源代码实现 AOP原理 AOP采用横向抽取机制,取代了传统纵向继承体系重复性代码 传统的纵向抽取机制: 横向抽取机制: AOP操作术语 1. ...
- ajax解析json对象集合
这个需求是我们做项目经常遇到的,当你想渲染表格的数据,你的数据在servlet中存在了arraylist中,你想把arraylist传到ajax的data中,这时候就需要用到ObjectMapper对 ...
- 2_稳定性分析_极点_Stability
在复平面内 控制理论就是设计控制器D使输入输出之间的传递函数的极点落在复平面的左侧,在现代控制理论中研究状态矩阵的特征值判断稳定性
- H5进阶篇--实现微信摇一摇功能
在HTML5中,DeviceOrientation特性所提供的DeviceMotion事件封装了设备的运动传感器时间,通过改时间可以获取设备的运动状态.加速度等数据(另还有deviceOrientat ...
- 打造专属自己的html5拼图小游戏
最近公司刚好有个活动是要做一版 html5的拼图小游戏,于是自己心血来潮,自己先实现了一把,也算是尝尝鲜了.下面就把大体的思路介绍一下,希望大家都可以做出一款属于自己的拼图小游戏,必须是更炫酷,更好玩 ...
- html5知识点补充—footer元素的使用
使用footer元素创建脚注 顾名思义,footer元素通常位于页面的底部.尽管footer通常位于某个区域或者页面的底部,但并非总是如此.footer元素旨在包含作者.网站所有者.版权数据.网站规章 ...
- javaweb图书管理系统之账号密码验证登录
验证账号与密码是否正确功能 一.注册功能 首先,在验证账号与密码是否正确的前提下的,需要先注册一个账号,如果没有账号,就会进不去,也无法验证. 其实,注册功能就是一个添加的功能,仿照我的第一篇文章,往 ...
- 【uniapp 开发】如何给边框添加阴影效果
css的box-shadow是用来添加边框阴影效果的. 属性值详解: 1.inset 可选值,默认阴影在盒子外 使用inset后,阴影在盒子内,即使指定边框或者透明边框,阴影依然存在. 2. 这是头两 ...
- 用反射实现JavaBean和Map之间的转换
学习内容: 需求 由于JavaBean结构与Map类似,我们可以把JavaBean与Map进行转换 代码如下: package com.yy; import java.beans.BeanInfo; ...