接口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
函数的目的是什么?它在哪里被使用?
原始异步函数:
private static async Task<int> GetResult()
{
var task = GetSomeData();
DoSomeWork();
return await task;
}
tasḱ
,编译器可能会知道这个- 再添加至少一个异步函数/任务并重试。 - Random Devawait task
放在DoSomeWork()
前面,这样也会强制进行状态转换。 - Random Dev