Await своими руками в C#
Привет, Хабр! Многим кажется, что await работает только с Task и ValueTask , но на самом деле язык позволяет сделать любой объект ожидаемым — нужно лишь реализовать определённый паттерн. Итак, зачем нужен свой await? Бывают случаи, когда вам хочется написать асинхронный метод, но результат приходит не из готового Task или таймера. Например, ждёте какое-то событие, изменение файла, считывание из сокета, или просто хотите встроить задержку без запуска Task . Когда вы пишете await expr , компилятор в глубине понимает так: берётся результат expr.GetAwaiter() , затем вызывается awaiter.IsCompleted . Если false , он подписывается на awaiter.OnCompleted , когда завершится, и потом берёт awaiter.GetResult() .




