【问题标题】:Example of RestSharp ASYNC client.ExecuteAsync<T> () worksRestSharp ASYNC client.ExecuteAsync<T> () 工作示例
【发布时间】:2012-09-02 01:05:30
【问题描述】:

谁能帮我修改下面的代码:

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

【问题讨论】:

    标签: c# restsharp


    【解决方案1】:

    问题是……你不能返回一个异步传递的值,因为你的调用方法已经返回了。在获得结果之前阻止调用者会破坏使用 ExecuteAsync 的意义。在这种情况下,我会返回一个Task&lt;string&gt;(假设 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&lt;T&gt; 来表述异步,因为它非常核心。

    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
    

    【讨论】:

    • Deserialize 在什么命名空间中?
    【解决方案3】:

    从阅读代码来看,您似乎想使用 ExecuteAsGetExecuteAsPost 而不是异步实现。

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

    【讨论】:

    • 这个问题是RESTSharp特有的,不要认为ExecuteGet可用。
    • 根据您链接到的代码,它在此处定义(ExecuteAsGet、ExecuteAsPost 和普通的旧 Execute):github.com/restsharp/RestSharp/blob/master/RestSharp/…
    • 取决于平台。 Windows Phone 的 RestSharp 仅包含异步方法
    【解决方案4】:

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

    例如:

    • ExecuteTaskAsync(request)(返回Task&lt;IRestResponse&gt;
    • ExecuteGetTaskAsync(request)(返回Task&lt;IRestResponse&gt;
    • ExecuteGetTaskAsync&lt;T&gt;(request)(返回Task&lt;IRestResponse&lt;T&gt;&gt;

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-28
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多