使 ActionResult 异步以提高性能并消除闪烁
Make ActionResult Asynchronous To Increse Performance And elimate Flickering
我想让这个动作异步,谁能帮忙解决这个问题。
[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); }
}
因为我正在使用三个 httpget 方法在一个页面加载时执行并且屏幕闪烁三个Times.So我需要并行处理。
不确定您要在这里寻找什么。使操作异步就像添加 async
关键字并返回 Task<ActionResult>
:
一样简单
public async Task<ActionResult> LoadAddressDetail(int? whId)
当然,那么,你必须await
点东西。我看到的唯一似乎可以做任何工作的是 wareHouseMasterService.LoadAddressGrid
,但您没有提供有关它的作用的详细信息。一般来说,您还需要使此方法异步,或者添加它的异步版本。然后,你会简单地做:
GridData = await wareHouseMasterService.LoadAddressGridAsync(...),
综上所述,有一个重要问题需要牢记。在 Web 请求的上下文中,异步与并行处理不是一回事,它也不会使任何事情发生 "faster"。此外,使用异步对性能的影响很小,因为随之而来的是开销。换句话说,简单地使此操作异步实际上并不能真正满足您提到的任何其他目标。
使用异步的真正原因是让您的网络服务器更有效地处理负载。当处理请求的线程处于等待状态时,异步允许线程返回到池中以处理其他请求。由于 Web 服务器可以产生的线程数量有上限,因此它可以同时处理的请求数量也有上限,因此当服务器处于负载下时,异步会为您提供一些额外的空间。不过差不多就是这些了。
就是说,如果您在开发中尝试所有这些,使用 IIS Express,重要的是要认识到 IIS Express 是 单线程。换句话说,请求按顺序排队和处理,因为原始性能并不是开发中的真正因素。因此,在这种情况下,您的三个 AJAX 请求一次处理一个,而不是像在完整的 IIS 中那样并行处理,这可能是您遇到的问题的来源。异步 可能 在这里有所帮助,但不一定。无论如何,这只是开发中的问题。
除此之外,您需要查看 JavaScript 并确保您以优化的方式做事,以便有效地处理 AJAX 请求。除了让一切发生得更快之外,还有一些方法可以最大限度地减少无样式内容问题的出现。但是,由于您没有发布这方面的代码,因此无法多说。
我想让这个动作异步,谁能帮忙解决这个问题。
[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); }
}
因为我正在使用三个 httpget 方法在一个页面加载时执行并且屏幕闪烁三个Times.So我需要并行处理。
不确定您要在这里寻找什么。使操作异步就像添加 async
关键字并返回 Task<ActionResult>
:
public async Task<ActionResult> LoadAddressDetail(int? whId)
当然,那么,你必须await
点东西。我看到的唯一似乎可以做任何工作的是 wareHouseMasterService.LoadAddressGrid
,但您没有提供有关它的作用的详细信息。一般来说,您还需要使此方法异步,或者添加它的异步版本。然后,你会简单地做:
GridData = await wareHouseMasterService.LoadAddressGridAsync(...),
综上所述,有一个重要问题需要牢记。在 Web 请求的上下文中,异步与并行处理不是一回事,它也不会使任何事情发生 "faster"。此外,使用异步对性能的影响很小,因为随之而来的是开销。换句话说,简单地使此操作异步实际上并不能真正满足您提到的任何其他目标。
使用异步的真正原因是让您的网络服务器更有效地处理负载。当处理请求的线程处于等待状态时,异步允许线程返回到池中以处理其他请求。由于 Web 服务器可以产生的线程数量有上限,因此它可以同时处理的请求数量也有上限,因此当服务器处于负载下时,异步会为您提供一些额外的空间。不过差不多就是这些了。
就是说,如果您在开发中尝试所有这些,使用 IIS Express,重要的是要认识到 IIS Express 是 单线程。换句话说,请求按顺序排队和处理,因为原始性能并不是开发中的真正因素。因此,在这种情况下,您的三个 AJAX 请求一次处理一个,而不是像在完整的 IIS 中那样并行处理,这可能是您遇到的问题的来源。异步 可能 在这里有所帮助,但不一定。无论如何,这只是开发中的问题。
除此之外,您需要查看 JavaScript 并确保您以优化的方式做事,以便有效地处理 AJAX 请求。除了让一切发生得更快之外,还有一些方法可以最大限度地减少无样式内容问题的出现。但是,由于您没有发布这方面的代码,因此无法多说。