В Часто задаваемые вопросы по Async/Await, Стивен Туб говорит:
ожидаемый - это любой тип, который предоставляет метод
GetAwaiter
, который возвращает действительный awaiter....
awaiter - это любой тип, возвращаемый из метода awaitablesGetAwaiter
и который соответствует определенному шаблону.
Итак, чтобы быть awaiter, тип должен:
- Внедрите интерфейс
INotifyCompletion
. - Предоставить логическое свойство, называемое
IsCompleted
. - Предоставьте безпараметрический метод
GetResult
, который возвращаетvoid
илиTResult
.
(Я игнорирую ICriticalNotifyCompletion
).
Но для чего эти участники? Я знаю, что на той же странице, о которой я упоминал выше, есть образец, который показывает, как компилятор переводит ожидания, но я просто не понимаю.
Может ли кто-нибудь объяснить это как можно проще, как рассказать об этом 5-летнему ребенку?
Когда я жду ожидаемого,
- Когда код проверяет
IsCompleted
? Где я должен установить его? - Когда он вызывает
OnCompleted
? - Вызывает ли он
OnCompleted
параллельно или должен быть асинхронный код внутриOnCompleted
? - Я видел примеры прямого вызова параметра продолжения
OnCompleted
и использованияTask.Run(continuation)
в разных примерах, на что я должен идти и когда?