gpt4 book ai didi

c# - IAsyncStateMachine.SetStateMachine 的目的是什么?

转载 作者:可可西里 更新时间:2023-11-01 08:43:28 26 4
gpt4 key购买 nike

接口(interface)IAsyncStateMachine 只能由编译器使用,用于为异步方法生成状态机。接口(interface)具有 SetMachineState - 使用堆分配的副本(来自 msdn)配置状态机。

我使用 ILSpy 反编译代码并发现生成的状态机,并提到 SetMachineState 函数的实现总是空的,像这样

[CompilerGenerated]
private sealed class <GetResult>d__1 : IAsyncStateMachine
{
//some fields to hold state

void IAsyncStateMachine.MoveNext()
{ ... }

[DebuggerHidden]
void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine)
{
//Method is empty
}
}

还有一件事,生成的状态机是一个,而不是到处都声明的结构

那么,问题来了:IAsyncStateMachine接口(interface)的SetStateMachine函数的作用是什么,用在什么地方?

原始异步函数:

private static async Task<int> GetResult()
{
var task = GetSomeData();
DoSomeWork();
return await task;
}

最佳答案

发生这种情况是因为您查看的是调试 构建而不是发布

使状态机成为一个结构体是一种编译器优化。它允许在等待时等待已完成时不分配内存。这种优化在调试时不是必需的,它使在 Visual Studio 中实现调试功能变得更加困难。

如果您查看在 release 中编译的相同代码,状态机确实是一个结构并且 SetStateMachine 方法不会为空,因为这是将状态机从堆栈移动到堆:

[CompilerGenerated]
[StructLayout(LayoutKind.Auto)]
private struct <GetResult>d__1 : IAsyncStateMachine
{
public AsyncTaskMethodBuilder<int> <>t__builder;
...

[DebuggerHidden]
void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine)
{
this.<>t__builder.SetStateMachine(stateMachine);
}
}

关于c# - IAsyncStateMachine.SetStateMachine 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32548509/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com