2012-09-02 15 views
18

Podría alguien por favor me ayude a modificar el código de abajo:Ejemplo de RestSharp ASYNC client.ExecuteAsync <T>() funciona

client.ExecuteAsync(request, response => { 
    Console.WriteLine(response.Content); 
}); 

Básicamente quiero utilizar el método ExecuteAsync anteriormente, pero no quieren imprimir volver pero la respuesta. Contenido para quien llama.

¿Hay alguna manera fácil de lograr esto?

yo probamos este pero tampoco' trabajo:

public T Execute<T>(RestRequest request) where T : new() 
     { 
      var client = new RestClient(); 
      client.BaseUrl = BaseUrl; 
      client.Authenticator = new HttpBasicAuthenticator(_accountSid, _secretKey); 
      request.AddParameter("AccountSid", _accountSid, ParameterType.UrlSegment); // used on every request 
      var response = client.ExecuteAsync(request, response => { 
    return response.data); 
}); 

}

El código anterior es de https://github.com/restsharp/RestSharp

Respuesta

36

Ahí está la cosa ... no se puede devolver un valor de forma asíncrona entregado , porque su método de llamada ya habrá regresado. Bloquear a la persona que llama hasta que obtenga un resultado que no sea válido para usar ExecuteAsync. En este caso, me gustaría devolver un Task<string> (response.Content suponiendo que es una cadena):

Task<string> GetResponseContentAsync(...) 
{ 
    var tcs=new TaskCompletionSource<string>(); 
    client.ExecuteAsync(request, response => { 
    tcs.SetResult(response.Content); 
    }); 
    return tcs.Task; 
} 

Ahora, cuando se completa la tarea, que tienen un valor. A medida que nos movemos a C# 5 async/await, debería acostumbrarse a establecer la asincronía en términos de Task<T>, ya que es bastante importante.

http://msdn.microsoft.com/en-us/library/dd537609.aspx

http://msdn.microsoft.com/en-us/library/hh191443.aspx

+0

¿podría elaborar "no se puede devolver un una valor entregado sincrónicamente " –

0

De la lectura del código parece que desea utilizar ExecuteAsGet o ExecuteAsPost lugar de la implementación asíncrona.

O tal vez solo Ejecutar- no estoy seguro exactamente de qué tipo es el Cliente.

+0

Esta pregunta es específica de RESTSharp, no creo que ExecuteGet esté disponible. –

+0

De acuerdo con el código al que se ha vinculado, se define aquí (ExecuteAsGet, ExecuteAsPost y simplemente antiguo Execute): https://github.com/restsharp/RestSharp/blob/master/RestSharp/RestClient.Sync.cs –

+0

Depende de la plataforma. RestSharp para Windows Phone solo contiene los métodos asincrónicos –

5

Con la ayuda de @spender, esto es lo que tengo:

Puede añadir nuevo archivo en el proyecto RestSharp, y añadir este código:

public partial class RestClient 
{ 
    public Task<IRestResponse<T>> ExecuteAsync<T>(IRestRequest request) 
    { 
     var tcs=new TaskCompletionSource<IRestResponse<T>>(); 

     this.ExecuteAsync(request, response => 
      { 
       tcs.SetResult(
        Deserialize<T>(request, response) 
       ); 
      }); 

    return tcs.Task; 
    }  
} 

esto será prácticamente devolver la respuesta completa, con código de estado y todo, para que pueda comprobar si el estado de la respuesta es correcta antes de conseguir el contenido, y se puede obtener el contenido con:

response.Content 
+2

¿En qué espacio de nombres se encuentra 'Deserialize'? – im1dermike

Cuestiones relacionadas