2012-09-02 57 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