Подтвердить что ты не робот

Пример RestSharp ASYNC client.ExecuteAsync <T>() работает

Может кто-то помочь мне изменить код ниже:

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

В основном я хочу использовать метод ExecuteAsync выше, но не хочу печатать, но возвращать ответ. Контент для вызывающего.

Есть ли простой способ достичь этого?

Я пробовал это, но не работает:

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

}

Вышеприведенный код https://github.com/restsharp/RestSharp

4b9b3361

Ответ 1

Вот что... вы не можете вернуть асинхронно доставленное значение, потому что ваш метод вызова уже вернется. Блокировка вызывающего абонента до тех пор, пока у вас не будет результата, будет проиграна точка использования ExecuteAsync. В этом случае я вернул бы Task<string> (предполагая, что response.Content - это строка):

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

Теперь, когда задача завершена, у вас есть значение. Когда мы перейдем к async/wait С# 5, вы должны привыкнуть указывать асинхронность в терминах Task<T>, поскольку это довольно ядро.

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

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

Ответ 2

С помощью @spender это то, что я получил:

Вы можете добавить новый файл в проект RestSharp и добавить этот код:

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

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

response.Content

Ответ 3

Из чтения кода кажется, что вы хотите использовать ExecuteAsGet или ExecuteAsPost вместо реализации async.

Или, может быть, просто Execute - не уверен, какой именно тип клиента.