RestSharp: ExecuteAsync‹T› никогда не отвечает

Я пытаюсь сделать асинхронный запрос на получение с помощью ExecuteAsync<T>, но он никогда не отвечает. Меня смущает то, что ExecuteAsync работает, как и синхронные методы Execute и Execute<T>.

Вот мой код:

var restClient = new RestClient("http://localhost:44268/api/");
var request = new RestRequest("jobs/{id}", Method.GET);
request.AddUrlSegment("id", "194");

// works
var req1 = restClient.Execute(request).Content;

// works
var req2 = restClient.Execute<Job>(request).Content;

// works
var req3 = restClient.ExecuteAsync(request, (restResponse) =>
{
    var test = restResponse.Content;
    Console.WriteLine(test);
});

var req4 = restClient.ExecuteAsync<Job>(request, (restResponse) =>
{
    // this code is never reached
    var test = restResponse.Content;
    Console.WriteLine(test);
});

Он выполняет успешный вызов API, но никогда не выполняет обратный вызов. Почему? Я делаю что-то неправильно?


person indot_brad    schedule 03.05.2012    source источник
comment
возможно, перед выполнением обратного вызова возникает исключение. Вы можете перейти к Debug › Exceptions и сказать, чтобы он ломался для всех исключений CLR?   -  person John Sheehan    schedule 04.05.2012
comment
Я только что попробовал это, и я получил те же результаты, к сожалению. Я все еще не получаю обратный вызов.   -  person indot_brad    schedule 04.05.2012
comment
на какой платформе работает клиент? какая версия restsharp? Вы можете попробовать предварительный пакет 103.1-beta на nuget?   -  person John Sheehan    schedule 04.05.2012
comment
Клиент представляет собой консольное приложение .NET 4.0. Я использовал версию 103.0.0 от Nuget. Я обновился до предварительной версии 103.1-beta, как вы сказали, и проблема была решена. Спасибо!   -  person indot_brad    schedule 04.05.2012


Ответы (2)


ExecuteAsync является асинхронным.

Это означает, что вызовы возвращаются немедленно, не дожидаясь ответа.

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

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

Попробуйте поместить вызов Console.ReadLine(); в конце вашего метода Main, чтобы предотвратить преждевременный выход.

person Nick Butler    schedule 03.05.2012
comment
Извините, я должен был быть более ясным. У меня есть Console.ReadLine() после этого кода, и если я поставлю точку останова в 3-м примере, который использует ExecuteAsync, он перезвонит просто отлично. Однако 4-й пример, использующий ExecuteAsync<Job>, никогда не достигает точки останова. - person indot_brad; 03.05.2012

Это было решено путем обновления до последней версии RestSharp.

person indot_brad    schedule 26.06.2012