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;
}

iasyncstatemmachine . setstatemmachine的目的是什么?

这是因为您正在查看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);
    }
}