RestSharp ASYNC client.ExecuteAsync ()的示例有效
有人可以帮我修改下面的代码:
client.ExecuteAsync(request, response => { Console.WriteLine(response.Content); });
基本上我想使用上面的ExecuteAsync方法,但不想打印但返回给调用者的response.Content。
有没有简单的方法来实现这一目标?
我试过这个,但没有工作:
public T Execute(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
有一件事……你不能返回一个异步传递的值,因为你的调用方法已经返回了。 阻止调用者直到你有结果会破坏使用ExecuteAsync的点。 在这种情况下,我将返回一个Task
(假设response.Content是一个字符串):
Task GetResponseContentAsync(...) { var tcs=new TaskCompletionSource (); client.ExecuteAsync(request, response => { tcs.SetResult(response.Content); }); return tcs.Task; }
现在,当任务完成时,您有一个值。 当我们转到c#5 async / await时,您应该习惯于在Task
方面声明异步,因为它是非常核心的。
在@spender的帮助下,这就是我得到的:
您可以在RestSharp项目中添加新文件,并添加以下代码:
public partial class RestClient { public Task> ExecuteAsync(IRestRequest request) { var tcs=new TaskCompletionSource>(); this.ExecuteAsync(request, response => { tcs.SetResult( Deserialize (request, response) ); }); return tcs.Task; } }
这实际上将返回完整的响应,包括状态代码和所有内容,因此您可以在获取内容之前检查响应的状态是否正常,并且您可以获取以下内容:
response.Content
通过阅读代码,您可能希望使用ExecuteAsGet
或ExecuteAsPost
而不是异步实现。
或者只是执行 – 不确定客户端的确切类型。