我讀過 await/async 不應(yīng)該創(chuàng)建/使用新線程,但編譯器在幕后創(chuàng)建了一個 astate 機器......所以我嘗試了這個,并且每次調(diào)用 F1 都使用來自 ThreadPool 的線程。class Program{ static System.Threading.SemaphoreSlim sem = new System.Threading.SemaphoreSlim(20, 20); static async void F1() { await sem.WaitAsync(); await sem.WaitAsync(); await Task.Delay(6000); var threadId = GetCurrentThreadId(); sem.Release(); sem.Release(); } static void Main(string[] args) { var threadId = GetCurrentThreadId(); F1(); F1(); F1(); F1(); F1(); F1(); F1(); F1(); Task.Delay(30000).Wait(); } [DllImport("kernel32.dll")] static extern uint GetCurrentThreadId();}
2 回答

斯蒂芬大帝
TA貢獻1827條經(jīng)驗 獲得超8個贊
您已經(jīng)使用了await Task.Delay(6000)
,它保證不會同步完成,因此:完成將通過它可以返回的任何方式返回 - 通常是線程池(因為這里沒有同步上下文在起作用)。線程池線程很便宜,只要你不長時間捆綁它們;如果它所做的只是捕獲當(dāng)前線程 id 并釋放,它們應(yīng)該在它們觸發(fā)后幾乎立即完成。
代碼需要在某處運行;你希望它在什么線程上運行?您的主線程當(dāng)前處于阻塞Wait()
調(diào)用中,因此它無法執(zhí)行任何操作。注意:您幾乎不應(yīng)該調(diào)用.Wait()
不完整的Task
.
- 2 回答
- 0 關(guān)注
- 137 瀏覽
添加回答
舉報
0/150
提交
取消