2017-09-13 18 views
0

MVC 5を使用してWebアプリケーションを構築していますが、実行時エラーが発生するため、PartialViewResultsでAsync/Awaitパターンを使用できません。このため、私は特定の作業を待っていません。例えばMVC 5でAsync/Awaitを使用しない場合の影響

私は私のアプリではほとんどのページで使用されてするPartialViewResultでこのヘッダーUIを持っています。

 /// <summary> 
     /// Get UI header for trainee's main details, name, aim, score etc 
     /// </summary> 
     /// <param name="personId"></param> 
     /// <param name="aim"></param> 
     /// <param name="showScore"></param> 
     /// <returns></returns> 
     public PartialViewResult _TraineeHeaderDetails(int personId, string aim, bool showScore, bool showEvidenceLink) 
     { 
      var result = _httpService 
       .Get(_urlConfigurations.GetTraineeDetails + personId + "/" + aim); 

      if (result.StatusCode != HttpStatusCode.OK) 
       //TODO: NG - add proper mvc error page redirect 
       throw new Exception("ID not found"); 
       //RedirectToAction("") 

      // use GetAwaiter to get around async/await limitation in MVC 5 
      var model = _jsonDeserializer.GetModelAsync<TraineeHeaderViewModel>(result).GetAwaiter().GetResult(); 

      if (model == null) return PartialView(new TraineeHeaderViewModel()); 

      //For link to trainee summary 
      model.PersonId = personId; 
      model.AimCode = aim; 

      // flag to show/hide graph 
      model.ShowScore = showScore; 

      // flag to show/hide evidence link 
      model.ShowEvidenceLink = showEvidenceLink; 

      return PartialView(model); 
     } 

あなたが見ることができるように、私のHTTPサービスの呼び出しは、MVCアクションで、私は通常、使用場所を取得することですGetAsyncとJSON結果を逆シリアル化するときに、私は.GetAwaiter()を使用しています。GetResult();

私の質問は、これはアプリのパフォーマンスに影響しますか?それはMVCなので、私が作業しているUIスレッド(Razorでレンダリングされている値)がないので、私は何をやっているのか考えていますが、他の人がこれについて考えるのを知りたいのです。

ニック

+2

async awaitを使用すると、非同期操作が完了するまで要求スレッドが解放されるため、IISアプリケーションプールでサーバー要求に使用できるワーカースレッドが限られています –

答えて

0

あなたが見ることができるように、私のHTTPサービスコールは、MVCのアクションで、私は通常、GetAsyncを使用し、また私のJSONの結果をデシリアライズするとき、私は.GetAwaiter()を使用してよどこ取得することです。のgetResult() ;

個人的には、ブロッキング(GetAwaiter().GetResult())ではなく、同期的に呼び出す必要がある場合は個人的に使用することをお勧めします。ブロッキング手法では、呼び出す非同期メソッドがawaitごとにConfigureAwait(false)を使用することが前提です。彼らが1つを忘れた場合、潜在的なデッドロックが発生します。

私の質問は、アプリのパフォーマンスに影響しますか?

おそらく、最初から最後までの時間という意味でのパフォーマンスには影響しません。これは間違いなくあなたのスケーラビリティに影響します。あなたのWebサーバーが激しくヒットしたり、突然突入したリクエストを受け取った場合、純粋なasyncソリューションを使用することができるだけでなく、拡張もできません。

しかし、あなたができることは何もありません。これはASP.NETクラシック(ASP.NETコアで修正済み)の制限です。それが人生。

関連する問題