.NET 中 如果一个Task A正在await另一个Task B,那么Task A是什么状态
.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是什么状态相关推荐
- C# Task和async/await详解
C# Task和async/await详解 什么是异步 Task介绍 1 Task创建和运行 2 Task的阻塞方法(Wait/WaitAll/WaitAny) 1 Thread阻塞线程的方法 2 T ...
- Task和async/await详解
一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...
- C#多线程和异步(二)——Task和async/await详解
一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...
- 一个 Task 不够,又来一个 ValueTask ,真的学懵了!
一:背景 1. 讲故事 前几天在项目中用 MemoryStream 的时候意外发现 ReadAsync 方法多了一个返回 ValueTask 的重载,真是日了狗了,一个 Task 已经够学了,又来一个 ...
- 【转】异步编程系列(Thread、Task、async/await、ajax等)
序 经过一番努力,我写的异步编程系列也算有头有尾,当然不是说这个系列已经更新完毕,这个头尾只是表示新旧知识点都有简单涉及到,接下去我还会丰富这一系列并且有机会整个小应用(愿景是弄一个开源组件吧,结合s ...
- 【转】Task和async/await详解
一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...
- C#多线程和异步(二)——Task和async/await详解(转载)
一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...
- ES6中的promise、async、await用法详解
<!DOCTYPE html> <html> <head><title>Promise.async.await</title> </h ...
- Hadoop中通过ToolRunner和Configured实现直接读取命令行动态出入reduce task数量,jar文件等...
一个典型的实现Tool的程序: /** MyApp 需要从命令行读取参数,用户输入命令如, $bin/hadoop jar MyApp.jar -archives test.tgz arg1 arg ...
最新文章
- hive外部表改为内部表_3000字揭秘Greenplum的外部数据加载——外部表
- 腾讯——这可是一只“骨骼清奇”的狗
- SpringMVC+MyBatis项目总结(一)
- Java数字反转(编程题)
- 【Java】7.1 与用户互动 7.2 系统相关
- yumdownloader和 repotrack下载rpm包
- Online DDL
- linux mk创建文件,Linux运维知识之Linux mkkickstart建立安装的组态文件命令详解
- Android之android8.1打开热点提示UID 10140 does not have Location permission和Location mode is enabled.
- 基类成员的public访问权限在派生类中变为_第17篇:C++继承中虚表的内存布局
- 【LeetCode】【数组】题号:56,重塑矩阵
- 游戏平台搭建免费版教程
- 51汇编——矩阵键盘
- 黑苹果OC的血泪史之硬盘(三星固态1T)篇
- CentOS7安装FTP服务器及默认21端口修改
- 基因家族分析⑤:进化树构建
- Js之正则表达式请使用字母、数字和特殊符号组合,8-20个字符
- 【MySQL】MySQL高手是如何练成的?
- 房租房贷可税前抵扣,等等!你还要考虑这个
- 中国电信计算机通信笔试题,中国电信入职考试题 求大神解答!
热门文章
- matlab 添加环境变量,CentOS 添加环境变量的三种方法
- 学习笔记Kafka(七)—— Kafka 与Spark集成 —— 原理介绍与开发环境配置、实战
- GreenDao高级用法
- java 模拟登陆exe_Java简单模拟登陆和爬虫实例---博客园老牛大讲堂
- @angular/core里的 NgZone -使得Angular不跟踪变化
- javascript 数组以及对象的深拷贝方法
- c语言学习题,C语言学习题目
- mybatis学习7之动态sql
- mysql导入sas文件夹_MYSQL导出HTML格式数据如何导入到SAS中
- hw叠加层开还是不开_HW叠加层是什么?