當await
是由編譯器所遇到它變換async
方法的狀態機和繼續經由AsyncTaskMethodBuilder AwaitUnsafeOnCompleted VS AwaitOnCompleted上AWAIT
AsyncTaskMethodBuilder.AwaitUnsafeOnCompleted
調度所概述here或AsyncTaskMethodBuilder.AwaitOnCompleted
所概述here。
翻翻.NET源here, AsyncTaskMethodBuilder.AwaitUnsafeOnCompleted
電話Awaiter.UnSafeOnCompleted
看來Awaiter.UnSafeOnCompleted
不流執行上下文(代碼here)。
注意它通過false
到flowExecutionContext
。這意味着如果我使用LogicalCallContext
(ExecutionContext
的一部分)來存儲任何數據(例如activityId),那麼它將不會流入連續路徑,這意味着我無法訪問它。
所以,我的問題是什麼原因導致編譯器選擇Unsafe Completion?
Stephen Toub也提到了同樣的事情here但沒有給出任何細節。 「.NET Framework中的所有這些方法都支持異步工作以這種方式捕獲和恢復ExecutionContext(即,除了那些前綴爲」Unsafe「的單詞之外的所有方法都是不安全的,因爲它們顯式不流執行上下文」
非常令人印象深刻的答案。據我可以告訴支持「每當'ICriticalNotifyCompletion'實現」的聲明實現細節可以在Roslyn的[AsyncMethodToStateMachineRewriter]中找到(https://github.com/dotnet/roslyn/blob/d4dab355b96955aca5b4b0ebf6282575fad78ba8/src/Compilers/ CSHARP /便攜/放下/ AsyncRewriter/AsyncMethodToStateMachineRewriter.cs) –