請問Task.Delay是在下面呼叫Task.Run,??是執行緒id改變的原因還是背后有不同的邏輯?
async Task Main()
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId); //11
await Task.Delay(200);
Console.WriteLine(Thread.CurrentThread.ManagedThreadId); //22
}
uj5u.com熱心網友回復:
不,Task.Delay不呼叫Task.Run下面。它只回傳Task在指定持續時間后完成的 a,并呼叫在ThreadPool. 它在System.Threading.Timer內部使用一個。它的實作如下所示:
public class Task
{
public static Task Delay(int millisecondsDelay)
{
var tcs = new TaskCompletionSource();
_ = new Timer(_ => tcs.SetResult(), null, millisecondsDelay, -1);
return tcs.Task;
}
}
因此,當您await在呼叫回呼的同一執行緒上運行Task.Delay后的延續1,這恰好是一個執行緒。awaitTimerThreadPool
注意:以上實作僅作為示例。這不是實際的實作,也不能保證正常作業。該Timer實體未存盤在任何地方,因此它可能會在呼叫回呼之前被垃圾回收,從而導致永遠不會完成的Task.
1假設沒有SynchronizationContext。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/462299.html
上一篇:async函式在開始時會正確更新迭代器,但不會在結束時正確更新迭代器
下一篇:具有多執行緒的異步服務器套接字
