我正在嘗試理解async/await和閱讀AsyncMethodBuilder. 我認為必須有一些類似xxx.Wait()或xxx.WaitOnce()等待任務完成的代碼。
但是,我在 class 中沒有找到這樣的代碼AsyncMethodBuilder。
system\runtime\compilerservices\AsyncMethodBuilder.cs https://referencesource.microsoft.com/#mscorlib/system/runtime/compilerservices/AsyncMethodBuilder.cs,96
所以我一直在挖掘,試圖閱讀Task, TaskScheduler, ThreadPoolTaskScheduler,的源代碼ThreadPool。
最后我上了課_ThreadPoolWaitCallback,但沒有找到任何來電者。
https://referencesource.microsoft.com/#mscorlib/system/threading/threadpool.cs,d7b8a78b4dd14fd0
internal static class _ThreadPoolWaitCallback
{
[System.Security.SecurityCritical]
static internal bool PerformWaitCallback()
{
return ThreadPoolWorkQueue.Dispatch();
}
}
另一個可能的代碼是在類SynchronizationContext,方法中SetWaitNotificationRequired()
https://referencesource.microsoft.com/#mscorlib/system/threading/synchronizationcontext.cs,8b34a86241c7b423
protected void SetWaitNotificationRequired()
{
...
RuntimeHelpers.PrepareDelegate(new WaitDelegate(this.Wait));
...
但我不知道RuntimeHelpers.PrepareDelegate在做什么,這是一個本地方法。
請給一些建議。有Wait嗎?如果是,它在哪里?
uj5u.com熱心網友回復:
在正確實作的異步實作中:沒有 wait。相反,在鏈的底部,存在一些代碼會創建一些異步源,這些源可以是 a TaskCompletionSource<T>、 anIValueTaskSource[<T>]或類似的東西 - 這允許該代碼將該令牌存盤在某處(例如,在佇列中,相關字典中) ,或 IOCP 的異步狀態物件),并將未完成的任務回傳給呼叫者。然后呼叫者發現它不完整,并注冊一個“當你有答案時,這樣做來重新激活我”回呼。那個呼叫代碼現在完全展開,每一步都說“完成后,推送到這里”,執行緒繼續做其他事情,例如為不同的請求提供服務。
在未來的某個時候(希望如此),結果會回來——再次,通過 IOCP,或者通過一個單獨的 IO 讀取器從某處拉出回應并將適當的專案從佇列/相關字典中取出,并說“結果是 {...}”(TrySetResult、TrySetException 等)。
在那段時間里沒有執行緒被阻塞。這就是 async/await 的最終目的:釋放執行緒,增加可擴展性。
在錯誤實作的異步系統中:一切皆有可能,包括 async-over-sync、sync-over-async 和其他一切。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/367631.html
