- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
接口(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/
接口(interface)IAsyncStateMachine 只能由编译器使用,用于为异步方法生成状态机。接口(interface)具有 SetMachineState - 使用堆分配的副本(来自
我试图理解这 4 个部分是如何组合在一起的: IAwaiter IAwaitable IAsyncMethodBuilder IAsyncStateMachine 我不明白 IAsyncMethodB
我是一名优秀的程序员,十分优秀!