2016-08-20 81 views
2

我已經向Azure發佈了一個非常基本的asp.net web api代碼,該代碼隨模板一起提供。當我嘗試默認的GET操作時,我得到JSON響應["value1","value2"]從Android應用程序調用Azure Web API只是等待響應時掛起

當我嘗試從我的xamarin-android項目進行相同的調用時,執行只是在等待響應時永遠掛起(請參閱下面的代碼)。

我使用visual studio 2015.我連接手機進行調試。

 button.Click += onButtonClick; 
    } 

    private void onButtonClick(object sender, EventArgs e) 
    { 
     GetValuesSync().Wait(); 
    } 

    private async Task GetValuesSync() 
    { 
     string ResponseJsonString = null; 

     string url = 
      "http://myWebapp.azurewebsites.net/api/values"; 

     using (var httpClient = new HttpClient()) 
     { 
      try 
      { 
       Task<HttpResponseMessage> getResponse = httpClient.GetAsync(url); 
       HttpResponseMessage response = await getResponse; //Execution hangs here forever ... 
       ResponseJsonString = await response.Content.ReadAsStringAsync(); 
       values = JsonConvert.DeserializeObject<string[]>(ResponseJsonString); 
      } 
      catch (Exception ex) 
      { 

       throw; 
      } 
     } 
    } 

感謝您的幫助

+1

這裏有死鎖'GetValuesSync()。Wait();'。 –

+0

@ Richard77:我推薦閱讀我的[關於異步最佳實踐的MSDN文章](https://msdn.microsoft.com/en-us/magazine/jj991977.aspx)和我的博客文章[不要阻止異步代碼] (http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html)。 –

回答

1

除上述答案外,作爲最佳實踐,請始終指定應在哪個線程上調用await之後的延續。在你的情況下,顯式調用ConfigureAwait(false)也應該解決死鎖問題。

+0

的確,我忘了補充一點。謝謝! –

+0

似乎這個問題更多地與我缺乏異步編程知識相關,而不是xamarin android的工作方式。我有很多事情要做。無法分辨將等待放在前面和在對象本身上調用等待之間的區別。 – Richard77

3

它總是最好離開異步工作流異步。強制使其同步將基本上阻止你的UI線程,該應用程序將失去其響應。

如果您嘗試這樣的事情是什麼:

private async void onButtonClick(object sender, EventArgs e) 
{ 
    await GetValuesAsync(); 
} 

private async Task GetValuesAsync() 
{ 
    string ResponseJsonString = null; 

    string url = 
     "http://myWebapp.azurewebsites.net/api/values"; 

    using (var httpClient = new HttpClient()) 
    { 
     try 
     { 
      Task<HttpResponseMessage> getResponse = httpClient.GetAsync(url); 
      HttpResponseMessage response = await getResponse; //Execution hangs here forever ... 
      ResponseJsonString = await response.Content.ReadAsStringAsync(); 
      values = JsonConvert.DeserializeObject<string[]>(ResponseJsonString); 
     } 
     catch (Exception ex) 
     { 

      throw; 
     } 
    } 
} 

我希望values沒有連接到用戶界面,或者您可能需要訪問UI線程更新它。

相關問題