ASP.NET MVCで非同期コントローラを使用

2933 ワード

スレッドプール
ずっとプロジェクトを非同期に書き換えたいと思っていましたが、ASP.NETMVC 3の下で書くのは煩雑すぎて、.NET 4.5とASP.NET MVCの下でコードを書くのは簡単で、MSもずっとこのようにするのが好きなようで、すべての成熟したものは、いくつかのバージョンに進化してこそ、規範化することができます.ASP.NET MVCではなぜ非同期を使用する必要があるのか、IISにはユーザの要求を処理するスレッドプールがあり、新しい要求が来ると、その要求を処理するためにプール内のスレッドをスケジューリングするが、同時量が高い場合、プール内のスレッドがこれほど多くの要求を満たすことができない場合、プール内の各スレッドがビジー状態である場合、要求の処理時に要求の処理スレッドがブロックされ、そのスレッドは別の要求にサービスを提供することができず、要求キューがいっぱいである場合、Webサーバは要求を拒否し、HTTP 503ビジー状態にある.ネットワーク操作などの高遅延を処理する場合、このようなスレッドの多くは待機状態だけでほとんどの時間は何もしないので、このようなスレッドは非同期プログラミングを使用してよりよく利用することができます.
非同期処理
たとえば、要求が2秒で完了するネットワーク呼び出しを生成する場合、要求は同期実行でも非同期実行でも2秒かかります.ただし、非同期呼び出しの場合、サーバは、最初のリクエストの完了を待つ間、他のリクエストへの応答をブロックしません.したがって、長時間実行される操作を呼び出す要求が多い場合、非同期要求は、要求キューが発生することを防止することができる..NET 4.5の最大スレッドプールが5000.NET 4.5の場合、awaitとasyncキーワードも追加され、非同期プログラミングが簡略化されます.
同期か非同期か(MSDN抜粋)
通常、同期パイプラインは、次の条件を満たすときに使用されます.
  • は操作が簡単か、実行時間が短い.
  • 単純性は効率よりも重要です.
  • この動作は、主に、大量のディスクまたはネットワークオーバーヘッドを含む動作ではなく、CPU動作である.CPUバインド操作に非同期操作方法を使用することは、何のメリットも得られず、より多くのオーバーヘッドをもたらす.

  • 通常、非同期パイプラインは、次の条件を満たすときに使用されます.
  • 動作は、CPUバインディングではなく、ネットワークバインディングまたはI/Oバインディングである.
  • 試験は、ブロッキング操作がウェブサイトのパフォーマンスにとってボトルネックであることを示し、これらのブロッキング呼び出しに非同期操作方法を使用することによって、IISはより多くの要求にサービスを提供することができる.
  • 並列性は、コードの単純性よりも重要です.
  • ユーザーが長時間の実行要求をキャンセルできるメカニズムを提供したい場合.

  •  
    ASP.NET MVCで非同期コントローラを使用
    #region 1、    
            
            [AsyncTimeout(1000)]
            public async Task<ActionResult> Index()
            {
                var data = await GetPageTaskAsync("http://163.com");
                return data;
            }
    
            public async Task<ActionResult> GetPageTaskAsync(string url)
            {
                try
                {
                    using (var client = new HttpClient())
                    {
                        await Task.Delay(3000);
                        var fetchTextTask = client.GetStringAsync(url);
                        return Json(new { fetchText = await fetchTextTask,error="NO" },JsonRequestBehavior.AllowGet);
                    }
                }
                catch (WebException ex)
                {
                    
                    throw ex;
                }
            }
    
            #endregion

     
    以下から抜粋:http://www.faceye.net/search/109990.html