2012-05-03 1 views
3

Я пытаюсь сделать запрос async get, используя ExecuteAsync<T>, но он никогда не отвечает. Меня смущает то, что ExecuteAsync работает, как и синхронные методы Execute и Execute<T>.RestSharp: ExecuteAsync <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, но он просто никогда не перезванивает. Зачем? Я делаю что-то неправильно?

+0

это возможно есть исключение бросают до обратного вызова выполняется. можете ли вы перейти в «Отладка»> «Исключения» и сказать, чтобы он прерывал все исключения CLR? –

+0

Я просто попробовал это, и к сожалению, у меня такие же результаты. Я все еще не получаю обратный вызов. –

+2

На какой платформе работает клиент? какая версия restsharp? можете ли вы попробовать предварительный выпуск 103.1-бета на nuget? –

ответ

1

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

2

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

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

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

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

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

+0

Извините, я должен был быть более ясным. У меня есть 'Console.ReadLine()' после этого кода, и если я поставлю точку останова в 3-м примере, использующем 'ExecuteAsync', он обратится обратно просто отлично. Однако, 4-й пример, который использует «ExecuteAsync », никогда не попадает в точку останова. –

0
public Task<IRestResponse> ExecuteAsync<T>(RestRequest request, RestClient client) 
{ 
    EventWaitHandle executedCallBack = new AutoResetEvent(false); 
    TaskCompletionSource<IRestResponse> tcs = new TaskCompletionSource<IRestResponse>(); 

IRestResponse res = new RestResponse(); 
    try 
    { 
     var asyncHandle = client.ExecuteAsync<RestResponse>(request, response => 
     { 
      res = response; 
      tcs.TrySetResult(res); 
      executedCallBack.Set(); 
     }); 


    } 
    catch (Exception ex) 
    { 
     tcs.TrySetException(ex); 
    } 

    return tcs.Task; 
} 
0
IRestResponse loginResponse = new RestResponse(); 
        TaskCompletionSource<IRestResponse> tcs = new TaskCompletionSource<IRestResponse>(); 

//Task task = new Task(() => {client.ExecuteAsync<RestResponse>(request, tcs.SetResult);});// Lambda and anonymous method 
Task task = new Task(() =>client.ExecuteAsync<RestResponse>(request, tcs.SetResult)); // Lambda and named method      
task.Start(); 
loginResponse = await tcs.Task;