2016-08-20 1 views
2

私は非常に基本的なasp.net Web APIコードをテンプレートに付属しているAzureに公開しました。私がデフォルトのGETアクションを試してみると、私はJSONレスポンスを受け取ります。["value1","value2"]アンドロイドアプリケーションから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();」。 Richard77 @ –

+0

:私は[非同期コードにはブロックしない]私[非同期のベストプラクティスに関する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

この1つの問題は、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に接続されていないか、あなたはそれを更新するUIスレッドにアクセスする必要があります願っています:

は何がこのような何かをしようとした場合。上記の回答に加えて

関連する問題