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
非常感谢!
回答你的问题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)