2017-09-13 67 views
0

我正在構建一個使用MVC 5的web應用程序,我不能在PartialViewResults中使用Async/Await模式,因爲它會導致運行時錯誤。正因爲如此,我不等待某些任務。在MVC中不使用異步/等待的影響4

例如,我有這個頭UI這是在我的應用程序大多數頁面使用的PartialViewResult:

 /// <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

IIS服務器請求中存在有限的工作線程,使用async await將釋放請求線程,直到異步操作完成 –

回答

0

正如你看到的,我的HTTP服務調用的就是其中MVC的行動我通常使用GetAsync也反序列化JSON我的結果,當,我使用.GetAwaiter()調用getResult() ;

個人而言,我喜歡在需要同步調用它們時使用同步API,而不是阻塞(GetAwaiter().GetResult())。阻塞方法假定您要調用的異步方法每使用ConfigureAwait(false)。如果他們忘記了一個,那麼你就有潛在的僵局。

我的問題是,這會影響應用性能嗎?

從時間到第一個字節的意義上說,它可能不會影響性能。它肯定會影響你的可擴展性;如果您的Web服務器遭到重創或突然涌入請求,那麼它將無法進行擴展,因爲它可能會使用純粹的解決方案。

但是你無法對此做任何事情。這是ASP.NET經典的一個限制(在ASP.NET Core中修復)。那就是生活。