【发布时间】:2021-04-24 07:59:48
【问题描述】:
.NET 编译器为 async/await 方法生成的状态机 (IAsyncStateMachine),出于性能原因,是一个处于发布模式的结构,它是一个处于调试模式的类,以提供更好的调试体验:which使这种“更好的体验”的确切技术原因是什么?
(我不知道这是否适用于所有编译器版本,但这不相关)。
【问题讨论】:
标签: .net async-await
.NET 编译器为 async/await 方法生成的状态机 (IAsyncStateMachine),出于性能原因,是一个处于发布模式的结构,它是一个处于调试模式的类,以提供更好的调试体验:which使这种“更好的体验”的确切技术原因是什么?
(我不知道这是否适用于所有编译器版本,但这不相关)。
【问题讨论】:
标签: .net async-await
其中一个原因是值类型(struct 是)按值传递(复制),而对于引用类型,传递的是“指针”。
这意味着调试器可以旧状态机的引用并控制其生命周期。
【讨论】:
IIRC 这是为了支持 EnC(编辑并继续)。请记住,局部变量之类的东西存储在IAsyncStateMachine 实现中。如果用户在他们的 async 方法中添加了一个新的局部变量,调试器需要在 IAsyncStateMachine 中添加一个对应的字段。
如果IAsyncStateMachine 是一个结构,那么在async 方法的堆栈中可能会有它的副本(如果我们还没有点击第一个await),那么在某个地方的盒子中可能会有一个副本在堆上,abd 也可能在其他地方?我想,与修改堆上类的单个实例相比,追踪所有这些副本并适当地修改它们更难/不可能。
【讨论】: