web-dev-qa-db-fra.com

Exemple de client RestSharp ASYNC.ExecuteAsync <T> () fonctionne

Quelqu'un pourrait-il m'aider s'il vous plaît à modifier le code ci-dessous:

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

En gros, je souhaite utiliser la méthode ExecuteAsync ci-dessus mais je ne souhaite pas imprimer mais renvoyer response.Content à l'appelant.

Y a-t-il un moyen facile d'y parvenir?

J'ai essayé ça mais ça ne marche pas:

    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);
});

}

Le code ci-dessus provient de https://github.com/restsharp/RestSharp

18
Nil Pun

Il y a le problème ... vous ne pouvez pas renvoyer de valeur asynchrone, car votre méthode d'appel aura déjà été renvoyée. Le fait de bloquer l'appelant jusqu'à ce que vous obteniez un résultat empêche le recours à ExecuteAsync. Dans ce cas, je retournerais un Task<string> (en supposant que response.Content est une chaîne):

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

Maintenant, lorsque la tâche est terminée, vous avez une valeur. Au fur et à mesure que nous passons au c # 5 async/wait, vous devriez vous habituer à déclarer asynchrone en termes de Task<T> car c'est assez fondamental.

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

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

36
spender

Avec l'aide de @spender, voici ce que j'ai obtenu:

Vous pouvez ajouter un nouveau fichier dans le projet RestSharp et ajouter le code suivant:

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;
    }       
}

Ceci retournera pratiquement la réponse complète, avec le code de statut et tout ce qui vous permet de vérifier si le statut de la réponse est correct avant d’obtenir le contenu, et vous pouvez obtenir le contenu avec:

response.Content
5
Boris

A la lecture du code, il semble que vous souhaitiez utiliser ExecuteAsGet ou ExecuteAsPost à la place de l'implémentation asynchrone.

Ou peut-être simplement Execute - ne sais pas exactement quel type de client est.

0
Chris Shain