2012-09-02 112 views
18

可能有人请帮我修改代码如下:示例工作

client.ExecuteAsync(request, response => { 
    Console.WriteLine(response.Content); 
}); 

基本上我想用ExecuteAsync方法之上,但不想打印,但返回的响应。内容给调用者。

有没有简单的方法来实现这一目标?

我试过,但犯规的工作:

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

回答

36

有事情......你不能返回一个异步让渡价值,因为你的调用方法已经返回。阻止调用者,直到你有一个结果,使用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

+0

你可以请详细说明:“你不能返回一个同步传递的值“ –

0

从阅读它看起来像你想使用的ExecuteAsGetExecuteAsPost而不是异步执行的代码。

或者可能只是执行 - 并不确定客户端的类型。

+0

此问题特定于RESTSharp,不要认为ExecuteGet可用。 –

+0

根据您链接到的代码,它在此处定义(ExecuteAsGet,ExecuteAsPost,并且只是普通的旧Execute):https://github.com/restsharp/RestSharp/blob/master/RestSharp/RestClient.Sync.cs –

+0

这取决于平台。适用于Windows Phone的RestSharp仅包含异步方法 –

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 
+2

“Deserialize”中有哪些名称空间? – im1dermike