Как правильно асинхронно отправить запрос и обработать ответ?

Отправляю Post запрос, а затем его обрабатываю - десериализую и пересылаю ответ:

// Отправка запроса на API др. сервиса
                string jsonRequest = JsonSerializer.Serialize(requestMessage);
                string jsonResponseData = await PostRequestHttpAsync(url, jsonRequest);

                ResponseMessageData responseData = JsonSerializer.Deserialize<ResponseMessageData>(jsonResponseData);

                await _telegramBotClient.SendTextMessageAsync(message.From.Id, responseData.TextMessage, ParseMode.Default, replyMarkup: new ForceReplyMarkup { Selective = true });

Дождется ли при таком варианте операция JsonSerializer.Deserialize<ResponseMessageData>(jsonResponseData); исполнения кода запроса PostRequestHttpAsync(url, jsonRequest);?

Дождется ли _telegramBotClient.SendTextMessageAsync того же кода?

Из оф. доков понял, что директива await говорит о том, что отсюда мы передаем управление в точку вызвавший данный метод и продолжаем выполнять код, который идет после вызова данной асинхронной функции не дожидаясь её исполнения, в моем случае нужно дождаться. Объясните пожалуйста как правильно.


Ответы (1 шт):

Автор решения: aepot

await завершает метод, который преобразуется компилятором в асинхронную машину состояний, и возврат к выполнению происходит в ту же точку, из которой был выход после того как асинхронная операция будет выполнена (или завершится с ошибкой).

Код текущего метода не продолжает выполняться, пока await не дождется завершения вызванной асинхронной операции.

В показанном коде проблем не наблюдаю, всё должно работать как ожидается.

Логически await, примененный сразу к вызову асинхронного метода работает как в синхронном коде.

Console.WriteLine("Запускаю операцию");
var result = await MethodAsync();
Console.WriteLine("Операция завершена");

А вот то что нельзя сделать в синхронном коде, так это вот так.

Console.WriteLine("Запускаю операцию");
var task = MethodAsync();
Console.WriteLine("Операция выполняется");
var result = await task;
Console.WriteLine("Операция завершена");

То есть при желании можно продолжить выполнение кода и в текущем методе, а дождаться завершения операции позднее.

→ Ссылка