【问题标题】:Reasons for better debugging experience for generated IAsyncStateMachine生成的 IAsyncStateMachine 获得更好调试体验的原因
【发布时间】:2021-04-24 07:59:48
【问题描述】:

.NET 编译器为 async/await 方法生成的状态机 (IAsyncStateMachine),出于性能原因,是一个处于发布模式的结构,它是一个处于调试模式的类,以提供更好的调试体验:which使这种“更好的体验”的确切技术原因是什么?

(我不知道这是否适用于所有编译器版本,但这不相关)。

【问题讨论】:

    标签: .net async-await


    【解决方案1】:

    其中一个原因是值类型(struct 是)按值传递(复制),而对于引用类型,传递的是“指针”。

    这意味着调试器可以旧状态机的引用并控制其生命周期。

    【讨论】:

    • 这可能是一个原因(遵循奥卡姆剃刀:)),但调试器可以使用发布模式中采用的相同技术来使用值类型。
    【解决方案2】:

    IIRC 这是为了支持 EnC(编辑并继续)。请记住,局部变量之类的东西存储在IAsyncStateMachine 实现中。如果用户在他们的 async 方法中添加了一个新的局部变量,调试器需要在 IAsyncStateMachine 中添加一个对应的字段。

    如果IAsyncStateMachine 是一个结构,那么在async 方法的堆栈中可能会有它的副本(如果我们还没有点击第一个await),那么在某个地方的盒子中可能会有一个副本在堆上,abd 也可能在其他地方?我想,与修改堆上类的单个实例相比,追踪所有这些副本并适当地修改它们更难/不可能。

    【讨论】:

      猜你喜欢
      • 2019-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多