日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

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

asp.net

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

發布時間:2025/3/21 asp.net 71 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .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是什么状态的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。