2016-09-08 3 views
0

このアクションを非同期にしたい、誰でも助けてください。ActionResultをIncreseパフォーマンスに非同期化し、ちらつきをエリートする

[HttpGet] 
public ActionResult LoadAddressDetail(int? whId) 
{ 
    try 
    { 
     return Json(new 
     { 
      GridData = wareHouseMasterService.LoadAddressGrid(GetCommonProperty(), whId ?? 0, DataManager.CustomerType, DataManager.CustomerTypeCode.WAREHOUSE.ToString()), 
      Status = true 
     }, JsonRequestBehavior.AllowGet); 
    } 
    catch (Exception e) { this.loggerService.Error(e); return Json(false, JsonRequestBehavior.AllowGet); } 
} 

私は1つのページのロードと画面で実行三のHTTPGETメソッドを使用しておりますので、私は、並列処理を必要とする三Times.Soを点滅します。

+1

「ActionResult」を非同期にすると、パフォーマンスが向上せず、ちらつきもなくなりません。 –

答えて

1

ここで探しているものが正確ではありません。アクションの非同期を作ることasyncキーワードを追加してTask<ActionResult>を返すのと同じくらい簡単です:もちろん

public async Task<ActionResult> LoadAddressDetail(int? whId) 

、そして、あなたがしなければならないawait何か。どんな仕事をしているように見えるのはwareHouseMasterService.LoadAddressGridですが、あなたはこれが何をしているかについて詳しくは述べていません。一般に、このメソッドを非同期にするか、非同期バージョンを追加する必要があります。次に、あなたは簡単にします:

GridData = await wareHouseMasterService.LoadAddressGridAsync(...), 

すべてのことに留意しておくべき大きな問題があります。 Asyncは、Webリクエストのコンテキストでは、並列処理と同じではなく、「高速」な処理も行いません。さらに、非同期を使用することによるパフォーマンスへの影響は軽微です。これに伴ってオーバーヘッドが発生するためです。言い換えれば、単純にこのアクションアクションを非同期にすることは、実際にあなたの言及された他の目標に実際には役立たない。

asyncを使用する本当の理由は、Webサーバーが負荷をより効率的に処理できるようにするためです。要求を処理するスレッドが待機状態にあるとき、asyncはスレッドをプールに戻して他の要求をフィールドに入れることを許可します。 Webサーバーが生成できるスレッドの量には上限があり、同時に処理できる要求の数が多いため、サーバーが負荷を受けているときに余分な余裕があります。しかしそれはかなりです。

つまり、IIS Expressを使用してこのすべてを開発しようとしている場合は、IIS Expressがシングルスレッドであることを理解することが重要です。言い換えれば、未処理のパフォーマンスは開発の実際の要素ではないため、要求は順次並行して処理されます。したがって、この状況では、あなたの3つのAJAXリクエストは、完全なIISである可能性が高いため、並列ではなく、一度に1つずつ処理されています。非同期かもしれないここに助けてください、しかし必ずしもそうではありません。それにかかわらず、それは開発の唯一の問題です。

これはすべて、JavaScriptを見て、AJAXリクエストが効率的に処理されるように最適化された方法で処理していることを確認する必要があります。また、単純にすべてをより早く行うこととは別に、スタイル化されていないコンテンツの問題のフラッシュを最小限に抑える方法もあります。しかし、この点に関してコードを投稿していないので、それ以上のことは言えません。

関連する問題