【问题标题】:.Net AsyncStateMachine custom implementation behaviors.Net AsyncStateMachine 自定义实现行为
【发布时间】:2019-01-04 11:20:09
【问题描述】:

我实现了一个自定义异步方法构建器,但我有几个问题我找不到合适的答案。

1) 我看到根据我的构建方式(调试/发布),状态机被编译成结构或类。是否可以指示编译器无论如何都要生成一个类?

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

3) 我将方法构建器设为一个类。我应该把它变成一个结构吗?这方面的最佳做法是什么?

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

环境:.Net Core 2.1

非常感谢!

【问题讨论】:

  • 你有代码吗?
  • 出于好奇,为什么需要自定义实现?

标签: c# .net-core async-await state-machine


【解决方案1】:

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

重写的结构或类的选择由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;

Link

【讨论】:

    猜你喜欢
    • 2020-02-15
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 2015-09-07
    相关资源
    最近更新 更多