.Net AsyncStateMachine自定义实现行为

Geo*_*ica 6 c# state-machine async-await .net-core

我实现了一个自定义异步方法构建器,但我有几个问题,我无法找到正确的答案.

1)我看到这取决于我如何构建(调试/发布),状态机被编译成结构或类.是否有可能指示编译器始终生成一个类,无论如何?

2)我看到void SetStateMachine(IAsyncStateMachine m)根本没有被调用,即使在文档中说,如果状态机是一个结构,它应该被调用它的盒装版本.

3)我让我的方法构建器成为一个类.我应该把它变成一个结构吗?这是什么最好的做法?

4)奇怪的是,GetAwaiter有时在调用builder.SetResult方法后调用.这是正常行为吗?如果我们检查任务的反编译版本,我们可以清楚地看到它首先请求awaiter,如果awaiter没有完成,它会调用机器状态AwaitOnCompleted/AwaitUnsafeOnCompleted.

环境:.Net Core 2.1

非常感谢!

div*_*481 1

回答你的问题1和3,你可以参考asyncRewriter的roslyn编译器代码

选择要重写的结构或类由 EditAndContinue 状态决定

// The CLR doesn't support adding fields to structs, so in order to enable EnC in an async method we need to generate a class.
var typeKind = compilationState.Compilation.Options.EnableEditAndContinue ? TypeKind.Class : TypeKind.Struct;
Run Code Online (Sandbox Code Playgroud)

关联