Почему структуры Awaiters (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
Причина создания awaitables структуры заключается в том, чтобы избежать ненужных распределений кучи и минимизировать объем памяти, когда компилятор создает конечный автомат за кулисами.
Это деталь реализации. Нет необходимости в том, чтобы быть типом struct
, а не a class
. Чтобы усилить это утверждение, попробуйте выполнить компиляцию async-метода в Roslyn в режиме Debug
, и вы увидите, что state-machine - это класс, где-как компиляция в Release
приведет к struct
. Подробнее об этом в Почему в Roslyn существуют классы async state machines (а не структуры)?