.Net AsyncStateMachine 自定义实现行为
.Net AsyncStateMachine custom implementation behaviors
我实现了自定义异步方法构建器,但我有几个问题找不到合适的答案。
1) 我看到根据我构建(调试/发布)的方式,状态机被编译成结构或 class。是否可以指示编译器无论如何始终生成 class?
2) 我看到 void SetStateMachine(IAsyncStateMachine m) 根本没有被调用,即使在文档中说,如果状态机是一个结构,它应该用它的盒装版本调用.
3) 我将我的方法构建器设为 class。我应该把它变成一个结构吗?这方面的最佳做法是什么?
4) 奇怪的是,GetAwaiter 有时在 builder.SetResult 方法被调用之后被调用。这是正常行为吗?如果我们检查一个Task的反编译版本,我们可以清楚地看到它首先请求一个等待者,如果等待者没有完成,它会调用机器状态AwaitOnCompleted / AwaitUnsafeOnCompleted。
环境:.Net Core 2.1
非常感谢!
回答你的问题1和3,你可以参考asyncRewriter的roslyn编译器代码
选择结构或 class 重写由 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;
我实现了自定义异步方法构建器,但我有几个问题找不到合适的答案。
1) 我看到根据我构建(调试/发布)的方式,状态机被编译成结构或 class。是否可以指示编译器无论如何始终生成 class?
2) 我看到 void SetStateMachine(IAsyncStateMachine m) 根本没有被调用,即使在文档中说,如果状态机是一个结构,它应该用它的盒装版本调用.
3) 我将我的方法构建器设为 class。我应该把它变成一个结构吗?这方面的最佳做法是什么?
4) 奇怪的是,GetAwaiter 有时在 builder.SetResult 方法被调用之后被调用。这是正常行为吗?如果我们检查一个Task的反编译版本,我们可以清楚地看到它首先请求一个等待者,如果等待者没有完成,它会调用机器状态AwaitOnCompleted / AwaitUnsafeOnCompleted。
环境:.Net Core 2.1
非常感谢!
回答你的问题1和3,你可以参考asyncRewriter的roslyn编译器代码
选择结构或 class 重写由 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;