我使用在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()方法,應用程序沒有任何響應。
任何幫助將不勝感激。
當您調用'.Result'時,同步上下文會死鎖。 (見斯蒂芬Cleary的鏈接在這裏:http://stackoverflow.com/questions/17248680/await-works-but-calling-task-result-hangs-deadlocks)爲什麼你不能像平常一樣「等待」任務? – David
沒有必要這樣做:using(var responseContent = response.Content) - 你在這裏沒有創建任何新的東西,需要獨立處理,在你的迴應中有「使用」,這就足夠了。只要做:var responseContent = await response.Content.ReadAsStringAsync(); – rouen
確保整個管道完全異步。如果處理不正確,則從同步方法調用異步代碼可能導致死鎖。並使用任務調用等待 – Chris