Из того, что я вижу, ответ всегда будет нулевым, поскольку вы вызываете асинхронную службу и не ожидаете завершения транзакции.
private IRestResponse response;
public IRestResponse POSTAsync(string url) {
IRestResponse response = null;
client.ExecuteAsync(new RestRequest(url, Method.POST), (r) => {
if (r.StatusCode == HttpStatusCode.OK) // This is going to a new thread and will be executing later
response = r; // eventually this will be called, but your method did not wait for that completition
});
return response; // Response will always be null because the Async method is not
// finished yet
}
Таким образом, вы не должны использовать try для использования асинхронных методов, если окружающий код не поддерживает его, так как в конце вам придется заблокировать ваш метод для ожидания результата.
По этой причине было создано ключевое слово async
, вам необходимо сделать все вызовы зависимыми также асинхронными вызовами, и именно поэтому контроллеры теперь поддерживают async
и задачи в качестве типа возврата (как пример из современного приложения Net Core):
[HttpGet("{msisdn}")]
public Task<string> Get(string msisdn)
{
return _hubUserProfileService.CallProfileService(msisdn);
}
Итак, обновите ваше приложение так, чтобы весь ваш запрос говорил асинхронно, или просто не используйте его, поскольку он ничего не вносит в ваш код, он даже сейчас более тяжелый, поскольку ему нужно создать задачу для вызова метода в другом потоке ... в то время как вызывающий метод все равно должен ждать ответа.
уточнить:
Вызов асинхронных методов не является волшебством, вы хотите, чтобы запрос выполнялся в другом потоке, но сразу после создания этого потока вы переходите к результату, который будет доступен, и это не то, как работает асинхронное выполнение, Ваш обратный вызов будет выполняться где-то в будущем, вы не знаете, когда, поэтому нужен метод обратного вызова, метод просто создаст задачу и продолжит работу, но задача еще не выполнена, но переменная по-прежнему равна нулю, Вы можете добавить Thread.Sleep()
перед ответом на запрос возврата, чтобы проверить, что я говорю, таким образом вы могли бы дать время для завершения асинхронного обратного вызова, поэтому, делая его асинхронным, он не даст вам ничего нового.