RestSharp Async - PullRequest
       9

RestSharp Async

0 голосов
/ 28 августа 2018

Я пытаюсь выполнить асинхронный запрос, используя resharp, однако 'response' всегда нулевой, почему?

private IRestResponse response;
public IRestResponse POSTAsync(string url) {
 IRestResponse response = null;

 client.ExecuteAsync(new RestRequest(url, Method.POST), (r) => {
  if (r.StatusCode == HttpStatusCode.OK)
  response = r;
 });

 return response;
}

1 Ответ

0 голосов
/ 28 августа 2018

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

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() перед ответом на запрос возврата, чтобы проверить, что я говорю, таким образом вы могли бы дать время для завершения асинхронного обратного вызова, поэтому, делая его асинхронным, он не даст вам ничего нового.

...