2016-08-24 10 views
0

私は非同期エンドポイント(.NET C#)を実装して、javascript/ajaxでそれらを呼び出そうとしています。基本的な考え方は、複数のスレッドでリクエストを(> 2を同時に)分割することで、ユーザーはすべてのコールから個別に応答を得、各リクエストの実行時間は実際の計算時間(または待機時間)に相当します。非同期エンドポイントを同時に呼び出すJavaScript

public async Task<ActionResult> Call1() 
{ 
    var client = new HttpClient(); 
    var res = await client.GetAsync("http://httpbin.org/delay/3"); // Takes 3 seconds 

    return View("~/Views/Dashboard/Test.cshtml"); 
} 

public async Task<ActionResult> Call2() 
{ 
    var client = new HttpClient(); 
    var res = await client.GetAsync("http://httpbin.org/delay/2"); // Takes 2 seconds 

    return View("~/Views/Dashboard/Test.cshtml"); 
} 

ブラウザがメソッドCall1とCall2を同時に要求しているとします。今すぐ両方の通話が終了するまで(Call1(3sec)+ Call2(2sec))まで約5秒かかります。私が理解する限り、これは、.NETが非同期メソッドで同時に呼び出されたにもかかわらず、.NETがそれらを同期的に処理し、Call1を処理する前にCall1が終了するのを待つことを意味します。それは私が望むものではありません。

request times call1/call2

両方のサービスが(3秒+ 2秒)と呼ばれているが、私は、正しくわずか3秒で、次の方法のように複数の方法で同じ結果を達成したい:

public async Task<ActionResult> Delay() 
{ 
    var client1 = new HttpClient(); 
    Task<HttpResponseMessage> async1 = client1.GetAsync("http://httpbin.org/delay/3"); 

    var client2 = new HttpClient(); 
    Task<HttpResponseMessage> async2 = client2.GetAsync("http://httpbin.org/delay/2"); 

    HttpResponseMessage result1 = await async1; 
    HttpResponseMessage result2 = await async2; 

    return View("~/Views/Dashboard/Test.cshtml"); 
} 

他のスレッドをブロックしたり、同時に複数のメソッドを処理したりすることはできませんか?

ありがとうございました。 vill

+0

についてもっと読む「私の知る限り理解し、これは、それらが非同期で同時に呼ばれていましたが、.NETは、同期それらを処理し、Call2を取り扱う前に終了するCall1を待つことを意味しメソッドはこれが正しいとは思わない –

+0

[C#Parallel.ForEachループの書き方](https://msdn.microsoft.com/en-us/library/dd460720(v=vs.110).aspx) – user5226582

+0

@ user5226582:複数の方法でロジックを分離する必要があるので、Parallel-Classは使用できません。 – vill

答えて

0

なぜなら、result1を待ってからresult2を待っているからです。コードを試して修正してタスクリストを作成し、Task.WhenAllを使用してすべてのタスクを待ちます。 Task.WhenAllhere

public async Task<ActionResult> Delay() 
{ 
    var tasks= new List<Task>(); 

    var client1 = new HttpClient(); 
    tasks.Add(client1.GetAsync("http://httpbin.org/delay/3")); 

    var client2 = new HttpClient(); 
    tasks.Add(client2.GetAsync("http://httpbin.org/delay/3")); 

    await Task.WhenAll(tasks); 

    return View("~/Views/Dashboard/Test.cshtml"); 

}

関連する問題