.NET 中 如果一个Task A正在await另一个Task B,那么Task A是什么状态?答案是:WaitingForActivation

新建一个.NET Core控制台程序,输入如下代码:

class Program
{static void Main(string[] args){//启动outer task,然后在outer task里面启动inner taskvar outerTask = Task.Run(async () =>{//await 之前执行Console.WriteLine("Thread ID " + Thread.CurrentThread.ManagedThreadId.ToString() + " : Outer task began!");//启动inner taskvar innerTask = Task.Run(() =>{//inner task 的线程沉睡5秒Thread.Sleep(5000);});//输出outer task即将开始awaitConsole.WriteLine("Thread ID " + Thread.CurrentThread.ManagedThreadId.ToString() + " : Outer task will await!");await innerTask;//在outerTask的线程中await innerTask的Task线程//await 完成之后执行,从下面的输出可以看到,await之后的代码是使用一个新的线程来执行的,因为下面的Thread ID和await之前发生了变化Console.WriteLine("Thread ID " + Thread.CurrentThread.ManagedThreadId.ToString() + " : Outer task will be finished!");});Thread.Sleep(1000);//主线程沉睡1秒,之后outer task的线程肯定开始执行了Console.WriteLine($"Outer task status:{outerTask.Status.ToString()}");//检查outer task的状态,可以看到此时状态为WaitingForActivationThread.Sleep(6000);//沉睡6秒,之后outer task和inner task的线程肯定结束执行了,也就是说outerTask和innerTask应该都结束了Console.WriteLine($"Outer task status:{outerTask.Status.ToString()}");//再次检查outer task的状态,可以看此时状态为RanToCompletion
Console.WriteLine();Console.WriteLine();Console.WriteLine("Press key contiune...");Console.ReadKey();}
}

执行结果如下:

所以如果一个task在await另一个task,那么其状态就是WaitingForActivation

此外我们还可以更改上面代码中的outerTask为一个后台线程outerThread来做同样的测试,代码如下:

class Program
{//定义outer thread为Program类的静态变量,这样我们在其执行方法OuterThreadRun中也可以检查outer thread的状态static Thread outerThread;//这是outer thread的执行方法,其在outer thread里面启动inner taskstatic async void OuterThreadRun(){//await 之前执行Console.WriteLine("Thread ID " + Thread.CurrentThread.ManagedThreadId.ToString() + " : Outer thread began!");//显示在执行中的outer thread的状态,此时状态显示为Background,因为outer thread为后台线程,所以Background表示后台线程正在执行Console.WriteLine($"Thread ID { Thread.CurrentThread.ManagedThreadId.ToString() } : Outer thread status:{outerThread.ThreadState.ToString()}");//启动inner taskvar innerTask = Task.Run(() =>{//inner task 的线程沉睡5秒Thread.Sleep(5000);});//输出outer thread即将开始awaitConsole.WriteLine("Thread ID " + Thread.CurrentThread.ManagedThreadId.ToString() + " : Outer thread will await!");await innerTask;//在outer thread线程中await innerTask的Task线程//await 完成之后执行,从下面的输出可以看到,await之后的代码是使用一个新的线程来执行的,因为下面的Thread ID和await之前发生了变化Console.WriteLine("Thread ID " + Thread.CurrentThread.ManagedThreadId.ToString() + " : Outer thread will be finished!");}static void Main(string[] args){//初始化outer thread,绑定执行方法为OuterThreadRun,并设置IsBackground为true,即后台线程outerThread = new Thread(new ThreadStart(OuterThreadRun)){IsBackground = true};//开始执行outer thread
        outerThread.Start();Thread.Sleep(1000);//主线程沉睡1秒,之后outer thread线程肯定开始执行了Console.WriteLine($"Outer thread status:{outerThread.ThreadState.ToString()}");//检查outer thread的状态,可以看到此时状态为Stopped,因为现在outer thread正在await innerTask,这说明await中的线程状态是StoppedThread.Sleep(6000);//沉睡6秒,之后outer thread线程和inner task的线程肯定结束执行了,也就是说outerThread和innerTask应该都结束了Console.WriteLine($"Outer thread status:{outerThread.ThreadState.ToString()}");//再次检查outer thread的状态,可以看此时状态为Stopped,因为outerThread和innerTask都结束运行了
Console.WriteLine();Console.WriteLine();Console.WriteLine("Press key contiune...");Console.ReadKey();}
}

结果如下所示:

.NET 中 如果一个Task A正在await另一个Task B,那么Task A是什么状态相关推荐

  1. C# Task和async/await详解

    C# Task和async/await详解 什么是异步 Task介绍 1 Task创建和运行 2 Task的阻塞方法(Wait/WaitAll/WaitAny) 1 Thread阻塞线程的方法 2 T ...

  2. Task和async/await详解

    一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...

  3. C#多线程和异步(二)——Task和async/await详解

    一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...

  4. 一个 Task 不够,又来一个 ValueTask ,真的学懵了!

    一:背景 1. 讲故事 前几天在项目中用 MemoryStream 的时候意外发现 ReadAsync 方法多了一个返回 ValueTask 的重载,真是日了狗了,一个 Task 已经够学了,又来一个 ...

  5. 【转】异步编程系列(Thread、Task、async/await、ajax等)

    序 经过一番努力,我写的异步编程系列也算有头有尾,当然不是说这个系列已经更新完毕,这个头尾只是表示新旧知识点都有简单涉及到,接下去我还会丰富这一系列并且有机会整个小应用(愿景是弄一个开源组件吧,结合s ...

  6. 【转】Task和async/await详解

    一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...

  7. C#多线程和异步(二)——Task和async/await详解(转载)

    一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...

  8. ES6中的promise、async、await用法详解

    <!DOCTYPE html> <html> <head><title>Promise.async.await</title> </h ...

  9. Hadoop中通过ToolRunner和Configured实现直接读取命令行动态出入reduce task数量,jar文件等...

    一个典型的实现Tool的程序: /** MyApp 需要从命令行读取参数,用户输入命令如, $bin/hadoop jar MyApp.jar -archives test.tgz  arg1 arg ...

最新文章

  1. hive外部表改为内部表_3000字揭秘Greenplum的外部数据加载——外部表
  2. 腾讯——这可是一只“骨骼清奇”的狗
  3. SpringMVC+MyBatis项目总结(一)
  4. Java数字反转(编程题)
  5. 【Java】7.1 与用户互动 7.2 系统相关
  6. yumdownloader和 repotrack下载rpm包
  7. Online DDL
  8. linux mk创建文件,Linux运维知识之Linux mkkickstart建立安装的组态文件命令详解
  9. Android之android8.1打开热点提示UID 10140 does not have Location permission和Location mode is enabled.
  10. 基类成员的public访问权限在派生类中变为_第17篇:C++继承中虚表的内存布局
  11. 【LeetCode】【数组】题号:56,重塑矩阵
  12. 游戏平台搭建免费版教程
  13. 51汇编——矩阵键盘
  14. 黑苹果OC的血泪史之硬盘(三星固态1T)篇
  15. CentOS7安装FTP服务器及默认21端口修改
  16. 基因家族分析⑤:进化树构建
  17. Js之正则表达式请使用字母、数字和特殊符号组合,8-20个字符
  18. 【MySQL】MySQL高手是如何练成的?
  19. 房租房贷可税前抵扣,等等!你还要考虑这个
  20. 中国电信计算机通信笔试题,中国电信入职考试题 求大神解答!

热门文章

  1. matlab 添加环境变量,CentOS 添加环境变量的三种方法
  2. 学习笔记Kafka(七)—— Kafka 与Spark集成 —— 原理介绍与开发环境配置、实战
  3. GreenDao高级用法
  4. java 模拟登陆exe_Java简单模拟登陆和爬虫实例---博客园老牛大讲堂
  5. @angular/core里的 NgZone -使得Angular不跟踪变化
  6. javascript 数组以及对象的深拷贝方法
  7. c语言学习题,C语言学习题目
  8. mybatis学习7之动态sql
  9. mysql导入sas文件夹_MYSQL导出HTML格式数据如何导入到SAS中
  10. hw叠加层开还是不开_HW叠加层是什么?