2016-11-17 34 views
0

我已經將控制器和服務層設置爲最初不使用異步和任務。我更新了我的代碼(如下)。這是使用異步,任務並等待的正確方法嗎?隨着用戶數量的增長,我的代碼會長期受益嗎?使用帶有.Net 4.6的WebAPI2和Entity Framework 6的異步

控制器:

public async Task<IHttpActionResult> All() 
{ 
    var warmup = await _warmupService.GetAllAsync(); 

    if (warmup != null) 
     return Ok(warmup); 

    return NotFound(); 
} 

的控制器調用此方法在我服務層:

public async Task<Warmup> GetAllAsync() 
{    
    return await Task.Run(() => GetWarmup()); 
} 

GetWarmup()(也是服務)使得DB調用使用EF6:

private Warmup GetWarmup() 
{ 
    var warmup = new Warmup(); 

    var factoryTools = _db.FactoryTools.Select(tool => new { tool.Factory }); 
} 
+0

你在問是否正確?當你運行它會發生什麼?它工作嗎? – Amy

回答

1

這不是最好的辦法。如果可以,當您的底層代碼提供您可以等待的TaskTask<T>時,請避免使用Task.Run

private Warmup GetWarmup() 
{ 
    var warmup = new Warmup(); 

    var factoryTools = _db.FactoryTools.Select(tool => new { tool.Factory }); 
} 

你應該使用實體框架提供的本地異步方法,如演示了這裏:

而是在這段代碼

public async Task<Warmup> GetAllAsync() 
{    
    return await Task.Run(() => GetWarmup()); 
} 

使用Task.Run並使用此的https://msdn.microsoft.com/en-us/library/jj819165(v=vs.113).aspx

所以你的GetWarmUp()應該是async Task<Warmup>()並且調用Ent的本地異步方法之一ity框架。

請參閱https://msdn.microsoft.com/en-us/library/system.data.entity.queryableextensions(v=vs.113).aspx瞭解可用的異步擴展方法列表。

相關問題