Как правильно асинхронно отправить запрос и обработать ответ?
Отправляю 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 шт):
await завершает метод, который преобразуется компилятором в асинхронную машину состояний, и возврат к выполнению происходит в ту же точку, из которой был выход после того как асинхронная операция будет выполнена (или завершится с ошибкой).
Код текущего метода не продолжает выполняться, пока await не дождется завершения вызванной асинхронной операции.
В показанном коде проблем не наблюдаю, всё должно работать как ожидается.
Логически await, примененный сразу к вызову асинхронного метода работает как в синхронном коде.
Console.WriteLine("Запускаю операцию");
var result = await MethodAsync();
Console.WriteLine("Операция завершена");
А вот то что нельзя сделать в синхронном коде, так это вот так.
Console.WriteLine("Запускаю операцию");
var task = MethodAsync();
Console.WriteLine("Операция выполняется");
var result = await task;
Console.WriteLine("Операция завершена");
То есть при желании можно продолжить выполнение кода и в текущем методе, а дождаться завершения операции позднее.