当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) –