2017-08-12 11 views
-2

C#で非同期コードを書こうとしている間に、非同期であると確信していましたが、最近私は郵便配達員関数が非同期で同期をとっているときに関数が完了するのにかかる時間と、同じ時間が正確にかかるように見えますが、私のコードで何が間違っていましたか?ここでasync/awaitで書いても非同期操作が動作しない - C#

が私のコードです:

[HttpGet] 
    [Route("customerslist")] 
    public async Task<IHttpActionResult> getData() 
    { 
     string url1 = @"https://jsonplaceholder.typicode.com/photos"; 
     string url2 = @"https://jsonplaceholder.typicode.com/comments"; 
     string url3 = @"https://jsonplaceholder.typicode.com/todos"; 

     Task<string> firstTask = myHttpCall(url1); 
     Task<string> secondTask = myHttpCall(url2); 
     Task<string> thirdTask = myHttpCall(url3); 

     await Task.WhenAll(firstTask, secondTask, thirdTask); 

     var result = firstTask.Result + secondTask.Result + thirdTask.Result; 
     return Ok(result); 
    } 

    private async Task<string> myHttpCall(string path) 
    { 
     string html = string.Empty; 
     string url = path; 

     // Simple http call to another URL to receive JSON lists. 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
     request.AutomaticDecompression = DecompressionMethods.GZip; 

     using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
     using (Stream stream = response.GetResponseStream()) 
     using (StreamReader reader = new StreamReader(stream)) 
     { 
      html = reader.ReadToEnd(); 
     } 

     return html; 
    } 

私は彼らのJSONリストを取得するには、別のURLにHTTPリクエストを行い、誰も私を助けてくださいことができますか?誰かが私にそれを正しく書く方法を教えてもらえれば幸いです。

+3

はなぜ実行時間は、同期と非同期のために何が違うのでなければなりません?特に、他のコードを実行していない場合は、実行されるコードの量は同じです。 – jdweng

+3

'myHttpCall'メソッドについては、何も非同期ですが、内部で何も待っていません。 – DavidG

+2

実際には、非同期メソッドについての警告を待つ必要はありません。 –

答えて

2

あなたのHTTPコールは同期しています。このように、多かれ少なかれ、あなたmyHttpCall方法でのHttpClientを使用します。

private async Task<string> myHttpCall(string path) 
{ 
    using(HttpClient client = new HttpClient()) 
    { 
      HttpResponseMessage response = await client.GetAsync(path); 
      return await response.Content.ReadAsStringAsync(); 
    } 
} 

EDIT:HttpClientコンストラクタにオブジェクトには、次の自動解凍パスを追加するには:

HttpClientHandler handler = new HttpClientHandler() 
{ 
    AutomaticDecompression = DecompressionMethods.GZip 
}; 
+3

明らかに明白ではありませんが、 'HttpClient'は再利用されるものであり、毎回生成されたり、処分されたりすることはありません。このパターンを 'HttpClient'で推薦するという習慣から抜け出そうとするべきです。 – Crowcoder

+0

興味深い、私はそれについて知らなかった。詳細はこちら[https://stackoverflow.com/questions/15705092/do-httpclient-and-httpclienthandler-have-to-be-disposed] – Kedrzu

関連する問題