为什么awaiters(GetAwaiter - 使类等待)结构而不是类。使用课程有害吗?
public struct ConfiguredTaskAwaiter : ICriticalNotifyCompletion:
public struct YieldAwaiter : ICriticalNotifyCompletion:
public struct TaskAwaiter<TResult> : ICriticalNotifyCompletion
答案 0 :(得分:10)
将awaitables作为结构体的原因是当编译器在幕后创建状态机时,避免不必要的堆分配并最小化内存占用。
这是一个实现细节。对于等待struct
而不是class
,等待是没有必要的。要加强此声明,请尝试在Debug
模式下在Roslyn中编译异步方法,并且您将看到状态机是一个类,其中 - Release
中的编译将导致{ {1}}。有关详情,请参阅Why are async state machines classes (and not structs) in Roslyn?