在MVC 4中不使用Async / Await的含义

时间:2017-09-13 08:52:52

标签: c# asp.net-mvc asp.net-mvc-4 asynchronous

我正在使用MVC 5构建Web应用程序,而我无法在PartialViewResults中使用Async / Await模式,因为它会导致运行时错误。因此,我没有等待某些任务。

例如我有这个标题UI,它是我的APP中大多数页面上使用的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服务调用是通常使用GetAsync的MVC操作的地方,也是在反序列化我的JSON结果时,我使用.GetAwaiter()。GetResult();

我的问题是,这是否会影响应用效果?因为它是MVC并且没有我正在使用的UI线程(使用Razor渲染值),我认为我正在做的事情是好的,但我很想知道其他人的想法关于这个。

尼克

1 个答案:

答案 0 :(得分:0)

  

正如你所看到的,我的http服务调用是通常使用GetAsync的MVC操作的地方,也是在反序列化我的JSON结果时,我使用.GetAwaiter()。GetResult();

就个人而言,当我需要同步调用它时,我更喜欢使用同步API,而不是阻塞(DataGrid)。阻止方法假定您调用的异步方法对每GetAwaiter().GetResult()使用ConfigureAwait(false)。如果他们忘了一个,那么你就有可能陷入僵局。

  

我的问题是,这是否会影响应用效果?

从时间到第一字节的角度来看,它可能不会影响性能。它肯定会影响您的可扩展性;如果您的网络服务器遭受重创或突然发出请求,它就无法扩展,只能使用纯粹的await解决方案。

但是你无能为力。它是ASP.NET经典的限制(在ASP.NET Core中修复)。这就是生命。