Wenn await
vom Compiler angetroffen wird es transformiert die async
Methode auf eine Zustandsmaschine und die Fortsetzung überAsyncTaskMethodBuilder AwaitUnsafeOnCompleted vs AwaitOnCompleted auf Await
AsyncTaskMethodBuilder.AwaitUnsafeOnCompleted
hereAsyncTaskMethodBuilder.AwaitOnCompleted
oder wie skizziert als here umrissenen geplant ist.
Blick durch .NET Quelle here, AsyncTaskMethodBuilder.AwaitUnsafeOnCompleted
Anrufe Awaiter.UnSafeOnCompleted
Es scheint, dass Awaiter.UnSafeOnCompleted
nicht die ExecutionContext fließt (Code here).
Hinweis es false
-flowExecutionContext
gibt. Das bedeutet, wenn ich bin mit LogicalCallContext
(Teil von ExecutionContext
) alle Daten zu speichern (z.B. ActivityID), dann wird es nicht in Fortsetzungspfad geleitet werden, das bedeutet, dass ich nicht darauf zugreifen kann.
Also ist meine Frage , was bewirkt, dass der Compiler unsafe Completion wählt?
Stephen Toub erwähnt auch die gleiche Sache here aber gab keine Details. „Alle Methoden in .NET Framework, die Gabel asynchrone Arbeit erfassen und wiederherstellen ExecutionContext in einer Weise, wie dies (das heißt, alle mit Ausnahme derjenigen, für mit dem Wort voran‚Unsafe‘, die unsicher sind, weil sie explizit nicht fließen ExecutionContext“
Ziemlich beeindruckende Antwort. Soweit ich die blutigen Details der Implementierung kann sagen, die Unterstützung der „wann immer' ICriticalNotifyCompletion' implementiert“Anweisung kann in Roslyn des [AsyncMethodToStateMachineRewriter] zu finden (https://github.com/dotnet/roslyn/blob/d4dab355b96955aca5b4b0ebf6282575fad78ba8/src/Compilers/ CSharp/Portabel/Senken/AsyncRewriter/AsyncMethodToStateMachineRewriter.cs) –