我使用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調用異步等待的方式,但第二個電話不是?還有什麼我還能改進嗎?
注意
我之所以問這個是因爲:
「隨着異步控制器時,一個進程正在等待I/O完成,它的線程被釋放了服務器用於處理其他請求。「
因此,當第一個遠程database_service調用正在處理並等待那1秒時,線程返回到IIS?
但是第二次標籤計算需要1.5秒,這會再次阻塞當前線程1.5秒?
因此,我釋放並阻止線程,這是沒有道理或你有什麼想法?
當你有'async'時,你不使用'Task.FromResult',只是'return label;'你的意思是不在你的第一個例子中使用async/await嗎? –
我知道......因此我向您介紹了「修改後的代碼」,這就是您現在所建議的內容。 – Pascal