【发布时间】:2016-07-25 05:40:12
【问题描述】:
我正在使用 asp.net web api 2 和 Entity Framework 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 秒。
远程 database_service 调用 async-await 方式但第 2 次调用没有,还有什么好处吗?还有什么我可以改进的吗?
注意
之所以这么问是因为:
“使用异步控制器,当进程等待 I/O 完成时,它的线程被释放,供服务器用于处理其他请求。”
所以当第一个远程 database_service 调用正在处理并等待那 1 秒时,线程返回到 IIS??!!
但是第二个标签计算需要 1.5 秒会再次阻塞当前线程 1.5 秒吗?
所以我释放并阻塞线程,这没有意义或者你怎么看?
【问题讨论】:
-
当你有
async时你不使用Task.FromResult,只使用return label;你的意思是在你的第一个例子中不使用async/await 吗? -
我知道...因此我向您展示了“修改后的代码”,这就是您现在的建议。
标签: c# asp.net asynchronous async-await asp.net-web-api2