RestSharp异步客户端执行ExecuteAsync<T>()方法的示例工作。

19

能否有人帮我修改下面的代码:

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

上面的代码来自https://github.com/restsharp/RestSharp
4个回答

38

有一个问题...你不能返回异步传递的值,因为你的调用方法已经返回了。阻塞调用者直到你获得结果会破坏使用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的异步/等待,您应该开始习惯使用Task<T>来表达异步,因为它非常核心。

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

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


请问您能否详细说明“无法返回异步传递的值”? - Nil Pun

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

这将返回完整的响应,包括状态码和其他信息,因此您可以在获取内容之前检查响应的状态是否OK,并且您可以使用以下代码获取内容:

response.Content

4
Deserialize在哪个命名空间? - mellis481

1

从代码来看,您想要使用ExecuteAsGetExecuteAsPost而不是异步实现。

或者只需执行-不确定Client是哪种类型。


这个问题是针对RESTSharp的,不认为ExecuteGet可用。 - Nil Pun
根据您提供的代码,它在这里被定义了(ExecuteAsGet、ExecuteAsPost和普通的Execute):https://github.com/restsharp/RestSharp/blob/master/RestSharp/RestClient.Sync.cs - Chris Shain
它取决于平台。RestSharp仅包含用于Windows Phone的异步方法。 - Greg Woods

1
在某个时候,一堆支持System.Threading.Tasks.Task且名称中带有"Task"的重载函数被引入。它们可以像HttpClient的方法一样被等待。

例如:

  • ExecuteTaskAsync(request)(返回Task<IRestResponse>
  • ExecuteGetTaskAsync(request)(返回Task<IRestResponse>
  • ExecuteGetTaskAsync<T>(request)(返回Task<IRestResponse<T>>

然后,在以后的v106版本中,这些函数被弃用,取而代之的是默认支持Task,例如第一个变成了client.ExecuteAsync(request)

因此,现在你可以直接这样做:

var response = await client.ExecuteAsync(request);
return response.Content;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接