欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > asp.net >内容正文

asp.net

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

发布时间:2025/3/21 asp.net 84 豆豆
生活随笔 收集整理的这篇文章主要介绍了 .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();} }

 

结果如下所示:

 

《新程序员》:云原生和全面数字化实践50位技术专家共同创作,文字、视频、音频交互阅读

总结

以上是生活随笔为你收集整理的.NET 中 如果一个Task A正在await另一个Task B,那么Task A是什么状态的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。