async等待调用长时间运行的sync AND async方法
本文关键字:async sync AND 方法 运行 等待 调用 长时间 | 更新日期: 2023-09-27 17:58:22
我使用的是asp.net web api 2和实体框架6。
原始伪代码
public IHttpActionResult GetProductLabel(int productId)
{
var productDetails = repository.GetProductDetails(productId);
var label = labelCalculator.Render(productDetails);
return Ok(label);
}
修改后的代码
public async Task<IHttpActionResult> GetProductLabel(int productId)
{
var productDetails = await repository.GetProductDetailsAsync(productId); // 1 long second as this call goes into sub services
var label = labelCalculator.Render(productDetails); // 1.5 seconds synchrounous code
return Ok(label);
}
在我更改之前,一切都是同步运行的。
在我更改对再次调用数据库的远程服务的调用后,将以异步等待的方式完成。
然后我对一个只提供同步方法的渲染库进行同步调用。计算耗时1.5秒。
我用异步等待的方式调用了远程数据库服务,但第二次调用没有,这还有好处吗?我还有什么可以改进的吗?
注意
我之所以这么问是因为:
"使用异步控制器,当进程等待I/O完成时,其线程将被释放,供服务器用于处理其他请求。"
因此,当第一个远程database_service调用正在处理并等待1秒时,线程将返回IIS??!!
但是,第二个标签计算耗时1.5秒,会再次阻塞当前线程1.5秒,这又如何呢?
所以我释放并阻止线程,这没有意义,或者你怎么看?
渲染库不仅仅是"阻塞线程",它还在执行渲染。没有什么比这更好的了。
我调用远程数据库服务还有好处吗异步等待方式但第二次调用不是吗?
是的,这个调用现在是非阻塞的,可以与其他代码一起运行,即使只有1秒。
我还有什么可以改进的吗?
如果第二个调用也可以异步运行,那么整个方法就可以异步运行并且根本不会阻塞。
异步代码在引擎盖下创建了某种延续,它是一种合成糖,可以让异步编程感觉更同步。
一般来说,根据操作本身,使两个长时间运行的任务异步可能会有所帮助。它将为每个不同的长期运行任务使用不同的任务,并异步运行它们。
目前,这些任务在GetProductLabel中完全同步运行,这意味着如果它是您正在调用的唯一方法,则不会区分同步代码。
如果可能的话,我会让第二个方法异步,因为我不熟悉使用任务和异步等待的任何明显缺点。
在您的情况下,没有什么比这更好的了,也不会有太大的区别,因为您必须同步运行它,就像您使用第一个方法的结果一样。