2015-06-29 96 views
0

我使用在C#的HttpClient執行一個異步POST請求/ Xamarin一個值:C#HttpClient的異步POST請求任務不返回

private async Task<string> ServicePostRequest (string url, string parameters) 
    { 
     string result = String.Empty; 

     using (var client = new HttpClient()) { 
      HttpContent content = new StringContent (parameters); 
      content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue ("application/x-www-form-urlencoded"); 
      client.Timeout = new TimeSpan (0, 0, 15); 
      using(var response = await client.PostAsync(url, content)){ 
       using (var responseContent = response.Content) { 
        result = await responseContent.ReadAsStringAsync(); 
        Console.WriteLine (result); 
        return result; 
       } 
      } 
     } 
    } 

當我執行下面的代碼,預期的結果(JSON)是在終端中正確記錄:

Task<string> result = ServicePostRequest("http://www.url.com", "parameters"); 

現在,我想要得到這個結果到一個變量能夠解析它。然而,當我使用下面的代碼,沒有結果被記錄在所有和應用程序凍結:

Task<string> result = ServicePostRequest("http://www.url.com", "parameters"); 
string myResult = result.Result; 

此外,當我使用result.Wait()方法,應用程序沒有任何響應。

任何幫助將不勝感激。

+2

當您調用'.Result'時,同步上下文會死鎖。 (見斯蒂芬Cleary的鏈接在這裏:http://stackoverflow.com/questions/17248680/await-works-but-calling-task-result-hangs-deadlocks)爲什麼你不能像平常一樣「等待」任務? – David

+0

沒有必要這樣做:using(var responseContent = response.Content) - 你在這裏沒有創建任何新的東西,需要獨立處理,在你的迴應中有「使用」,這就足夠了。只要做:var responseContent = await response.Content.ReadAsStringAsync(); – rouen

+0

確保整個管道完全異步。如果處理不正確,則從同步方法調用異步代碼可能導致死鎖。並使用任務調用等待 – Chris

回答

1

由於ServicePostRequest是awaitable方法,改變這種:

Task<string> result = ServicePostRequest("http://www.url.com", "parameters"); 
string myResult = result.Result; 

要:

string result = await ServicePostRequest("http://www.url.com", "parameters"); 

側面說明:確保調用的方法是一個異步方法。

+0

我試圖使用await,但它給了我一個解析錯誤,說await只能使用它的包含方法標記爲async修飾符。我已經檢查過了,ServicePostRequest方法肯定有async修飾符。有什麼想法嗎? – Tomzie

+0

將調用方法轉換爲異步方法。 – Oluwafemi

+0

非常感謝!它正在工作。 – Tomzie