私は非同期エンドポイント(.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が終了するのを待つことを意味します。それは私が望むものではありません。
両方のサービスが(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
についてもっと読む「私の知る限り理解し、これは、それらが非同期で同時に呼ばれていましたが、.NETは、同期それらを処理し、Call2を取り扱う前に終了するCall1を待つことを意味しメソッドはこれが正しいとは思わない –
[C#Parallel.ForEachループの書き方](https://msdn.microsoft.com/en-us/library/dd460720(v=vs.110).aspx) – user5226582
@ user5226582:複数の方法でロジックを分離する必要があるので、Parallel-Classは使用できません。 – vill