.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 ...
随机推荐
- WebSQL是HTML 5规范的一部分吗?
不是,虽然很多人将其标记为HTML 5,但它不是HTML 5规范的一部分.HTML 5规范基于SQLite.
- Linux内核, 编译一个自己的内核
本文,我们将一步一步地介绍如何从源代码编译和安装一个Linux内核.需要注意的是本指导基于Ubuntu 20.04版本编译安装,其它发行版可能会有差异. 在前面文章中我们反复提到过Linux内核, ...
- 针对于iosAPP内嵌H5,-webit-overflow-scrolling:touch;产生空白情况
问题描述:一个内嵌IOSAPP的H5页面,长页面,大概1.6个屏幕高度,由于有列表滑动起来很不流畅,所以用了-webit-overflow-scrolling:touch;这个只针对ios端的物理滚动 ...
- 快如闪电,触控优先。新一代的纯前端控件集 WijmoJS发布新版本了
全球最大的控件提供商葡萄城宣布,新一代纯前端控件 WijmoJS 发布2018 v1 版本,进一步增强产品功能,并支持在 Npm 上的安装和发布,极大的提升了产品的易用性. WijmoJS 是用 Ty ...
- response.setHeader("Cache-Control","no-cache");的作用
1. response.setHeader("Cache-Control","no-cache"); This is used to prevent the ...
- Python使用递归绘制谢尔宾斯基三角形
谢尔宾斯基三角形使用了三路递归算法,从一个大三角形开始,通过连接每一个边的中点,将大三角型分为四个三角形,然后忽略中间的三角形,依次对其余三个三角形执行上述操作. 运行效果: 源代码: 1 impor ...
- java实现ssh连接工具类
import ch.ethz.ssh2.Connection;import ch.ethz.ssh2.Session;import ch.ethz.ssh2.StreamGobbler;import ...
- js中的undefined
undefined,一个特殊值,通常用于指示变量尚未赋值,是一个JavaScript的 原始数据类型 . 如果后台返回前台数据为空(无数据),那么用该对象获取其中的属性会显示undefined. 如果 ...
- JVM虚拟机类加载机制(一)
类从被加载到虚拟机内存中开始,到卸载出内存截止,整个生命周期包括:加载.验证.准备.解析,初始化.使用.卸载七个阶段.其中验证.准备.解析三个部分统称为连接. 类初始化情况: 遇到new.getsta ...
- SwitchHosts管理编辑hosts工具
管理Hosts工具 SwitchHosts 地址: SwitchHosts 开发工程中,针对不同项目设置不同的域名. 办法很多,例如直接编辑hosts文件,通过环境工具提供的功能设置等. 现在要安利一 ...