.NET 中 如果一个Task A正在await另一个Task B,那么Task A是什么状态
生活随笔
收集整理的這篇文章主要介紹了
.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是什么状态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软Azure CDN现已普遍可用
- 下一篇: 工作总结-基于R的数据分析