Пример 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
Ответы
Ответ 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 - не уверен, какой именно тип клиента.