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

4 回答 4

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>它的核心来描述异步。

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

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

于 2012-09-02T01:14:33.413 回答
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
于 2014-05-27T11:53:59.953 回答
1

通过阅读代码,您似乎想要使用ExecuteAsGetExecuteAsPost代替异步实现。

或者也许只是执行——不确定客户端到底是什么类型。

于 2012-09-02T01:14:39.250 回答
0

在某些时候,有一堆重载引入了这种支持System.Threading.Tasks.Task,并在其中包含了“任务”这个词。可以等待它们(如HttpClient's 方法)。

例如:

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

然后这些在后来的 v106 版本中被弃用,我相信任务支持是默认的,例如第一个成为client.ExecuteAsync(request).

所以这些天你可以这样做:

var response = await client.ExecuteAsync(request);
return response.Content;
于 2022-01-11T12:04:38.313 回答