C# Await, похоже, не ожидает ответа сервера Http - PullRequest
0 голосов
/ 22 февраля 2020

В этом фрагменте кода:

responseMessage = await HttpClient.SendAsync(requestMessage);

Программа завершает выполнение (с кодом завершения 0), как будто ничего плохого не произошло, не продолжая с этой строки. Однако, исходя из моего понимания await, он должен в основном блокироваться до тех пор, пока метод не вернет HttpResponseMessage, а затем продолжить последовательно.

Этот фрагмент кода ниже, кажется, делает то, что, как я думал, сделал верхний:

Task<HttpResponseMessage> sendAsyncTask = HttpClient.SendAsync(requestMessage);

sendAsyncTask.Wait();

responseMessage = sendAsyncTask.Result;

Почему это так? Что не так с первым фрагментом кода?

1 Ответ

2 голосов
/ 23 февраля 2020

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

Скорее всего, ваш метод Main (или какой-либо другой метод) между Main и этим) вызывает асинхронный метод и затем игнорирует возвращенную задачу вместо await ее. Или у вас есть async void где-то.

Однако, исходя из моего понимания await, он должен в основном блокироваться до тех пор, пока метод не возвратит HttpResponseMessage, а затем продолжить последовательно.

Весь смысл await в том, что не блокирует вызывающего. await делает «паузу» в методе, чтобы он мог «возобновить» позже, но await также возвращает вызывающей стороне во время выполнения задачи. Если вызывающая сторона затем выходит из приложения (например, путем выхода из Main), то у метода никогда не будет возможности возобновить работу, потому что приложение разорвано.

...