TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.77K subscribers
Post #252 474
День двести пятнадцатый. #ЗаметкиНаПолях
Многопоточность.
9. Async/await. Продолжение
Паттерн awaitable
Паттерн awaitable используется для определения типов, которые можно использовать с оператором await. Можно было бы ожидать интерфейса вроде IDisposable для оператора using. Однако поддержка await основана на шаблоне. Допустим, есть выражение типа T, которое необходимо ожидать. Компилятор выполняет следующие проверки:
1. T должен иметь метод GetAwaiter() без параметров, либо должен существовать метод расширения, принимающий один параметр типа T. Метод GetAwaiter не должен быть пустым. Тип возвращаемого значения метода называется awaiter («ожидатель»).
2. Awaiter должен реализовывать System.Runtime.INotifyCompletion, имеющий единственный метод: void OnCompleted(Action).
3. Awaiter должен иметь свойство IsCompleted типа bool.
4. Awaiter должен иметь метод GetResult() без параметров.
5. Этим не обязательно быть открытыми, но они должны быть доступны из асинхронного метода, в котором используется await.
6. Тип результата выражения await определяется типом результата метода GetResult. Если это тип void, значит await не возвращает значения.

Рассмотрим статический метод Task.Yield(). В отличие от большинства других методов класса Task, метод Yield() возвращает не задачу, структуру YieldAwaitable. Вот упрощенная версия задействованных типов:
public class Task
{
…
public static YieldAwaitable Yield();
}
public struct YieldAwaitable
{
public YieldAwaiter GetAwaiter();

public struct YieldAwaiter : INotifyCompletion
{
public bool IsCompleted { get; }
public void OnCompleted(Action continuation);
public void GetResult();
}
}
YieldAwaitable следует паттерну awaitable, описанному ранее. Поэтому можно вызвать:
await Task.Yield();
GetResult структуры YieldAwaiter возвращает void, поэтому код выше не имеет результата. То есть следующий код недопустим:
var result = await Task.Yield();

Продолжение следует…

Источник: Jon Skeet “C# In Depth”. 4th ed – Manning Publications Co, 2019. Глава 5.
More from @netdeveloperdiary
  1. Oct 10, 2026День 2810. #ЧтоНовенького #VSCode Более Быстрый и Лёгкий C# Dev Kit Мы, разработчики, люби…
  2. Oct 9, 2026День 2809. #Карьера 5 Навыков, Которые Помогут Быстрее Стать Сеньором. Окончание Начало 3.…
  3. Oct 8, 2026День 2808. #Карьера 5 Навыков, Которые Помогут Быстрее Стать Сеньором. Начало В ИТ есть се…
  4. Oct 7, 2026День 2807. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Окончание Нач…
  5. Oct 6, 2026🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК Приглашаем на открытое собес…
  6. Oct 6, 2026День 2806. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Начало Больши…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →