iasyncstatemmachine . setstatemmachine的目的是什么?
本文关键字:是什么 iasyncstatemmachine setstatemmachine | 更新日期: 2023-09-27 18:12:27
接口IAsyncStateMachine
只能被编译器使用,用于生成异步方法的状态机。接口具有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
}
}
还有一点,生成的状态机是class
,而不是到处说的struct
。
那么,问题是:IAsyncStateMachine
接口的SetStateMachine
函数的目的是什么,它用在哪里?
原async函数:
private static async Task<int> GetResult()
{
var task = GetSomeData();
DoSomeWork();
return await task;
}
这是因为您正在查看debug
构建而不是release
构建。
使状态机成为结构是一个编译器优化。它允许在等待任务已经完成时不分配内存。这种优化在调试时是不必要的,它使得在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);
}
}