有人可以帮我修改下面的代码:
client.ExecuteAsync(request, response => {
Console.WriteLine(response.Content);
});
基本上我想使用上面的ExecuteAsync方法,但不想打印,而是将response.Content返回给调用者。
有没有简单的方法来实现这个目标?
我试过这个但是没有工作:
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);
});
}
答案 0 :(得分:37)
有一件事......你不能返回一个异步传递的值,因为你的调用方法已经返回了。阻止调用者直到你有结果会失败使用ExecuteAsync。在这种情况下,我将返回Task<string>
(假设response.Content是一个字符串):
Task<string> GetResponseContentAsync(...)
{
var tcs=new TaskCompletionSource<string>();
client.ExecuteAsync(request, response => {
tcs.SetResult(response.Content);
});
return tcs.Task;
}
现在,当任务完成时,您有一个值。当我们转到c#5 async / await时,你应该习惯用Task<T>
表示异步,因为它是非常核心的。
答案 1 :(得分:5)
在@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
答案 2 :(得分:0)
通过阅读代码,您可能希望使用ExecuteAsGet
或ExecuteAsPost
而不是异步实现。
或者只是执行 - 不确定客户端的确切类型。