restclient new net executeasync example deserialize c# restsharp

c# - new - Ejemplo de un cliente RestSharp ASYNC. ExecuteAsync<T>() funciona



restsharp net core (3)

Ahí está la cosa ... no puede devolver un valor entregado de forma asíncrona, porque su método de llamada ya habrá regresado. El bloqueo de la persona que llama hasta que tenga un resultado anula el punto de usar ExecuteAsync. En este caso, devolvería una Task<string> (asumiendo que response.Content es una cadena):

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

Ahora, cuando la tarea se completa, tienes un valor. A medida que avanzamos a c # 5 async / await, deberías acostumbrarte a indicar la asincronía en términos de la Task<T> ya que es bastante básico.

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

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

¿Podría alguien ayudarme a modificar el siguiente código?

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

Básicamente, quiero usar el método ExecuteAsync anterior pero no quiero imprimir pero devolver la respuesta. Conteste a la persona que llama.

¿Hay alguna manera fácil de lograr esto?

Intenté esto, pero no funciona:

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


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

Puede agregar un nuevo archivo en el proyecto RestSharp y agregar 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 prácticamente devolverá la respuesta completa, con el código de estado y todo, por lo que puede verificar si el estado de la respuesta es correcto antes de obtener el contenido, y puede obtener el contenido con:

response.Content


Después de leer el código, parece que quiere usar ExecuteAsGet o ExecuteAsPost lugar de la implementación asíncrona.

O tal vez simplemente Ejecutar, no estoy seguro exactamente de qué tipo de Cliente es.