为什么Awaiters(async / await)结构而不是类?可以使用课程吗?

时间:2014-05-12 12:29:50

标签: c# .net asynchronous struct async-await

为什么awaiters(GetAwaiter - 使类等待)结构而不是类。使用课程有害吗?

public struct ConfiguredTaskAwaiter : ICriticalNotifyCompletion:

http://referencesource.microsoft.com/#mscorlib/system/runtime/compilerservices/TaskAwaiter.cs#b8626cdb2f1cbe65

public struct YieldAwaiter : ICriticalNotifyCompletion:

http://referencesource.microsoft.com/#mscorlib/system/runtime/compilerservices/YieldAwaitable.cs#1e1219f924e9e3b7

public struct TaskAwaiter<TResult> : ICriticalNotifyCompletion

http://referencesource.microsoft.com/#mscorlib/system/runtime/compilerservices/TaskAwaiter.cs#2c48fb3bdfc69022

1 个答案:

答案 0 :(得分:10)

将awaitables作为结构体的原因是当编译器在幕后创建状态机时,避免不必要的堆分配并最小化内存占用。

这是一个实现细节。对于等待struct而不是class,等待是没有必要的。要加强此声明,请尝试在Debug模式下在Roslyn中编译异步方法,并且您将看到状态机是一个类,其中 - Release中的编译将导致{ {1}}。有关详情,请参阅Why are async state machines classes (and not structs) in Roslyn?