我已将控制器和服务层设置为最初不使用async和Task。我更新了我的代码(下面)。这是使用async,Task和await的正确方法吗?随着用户数量的增长,我的代码会长期受益吗?
控制器:
public async Task<IHttpActionResult> All()
{
var warmup = await _warmupService.GetAllAsync();
if (warmup != null)
return Ok(warmup);
return NotFound();
}
Controller在我的服务层中调用此方法:
public async Task<Warmup> GetAllAsync()
{
return await Task.Run(() => GetWarmup());
}
GetWarmup()(也在Service中)使用EF6进行数据库调用:
private Warmup GetWarmup()
{
var warmup = new Warmup();
var factoryTools = _db.FactoryTools.Select(tool => new { tool.Factory });
}
答案 0 :(得分:1)
这不是最好的方法。如果可以,请避免在基础代码提供Task.Run
或Task
等待时使用Task<T>
。
而不是在这段代码中使用Task.Run
public async Task<Warmup> GetAllAsync()
{
return await Task.Run(() => GetWarmup());
}
并使用此:
private Warmup GetWarmup()
{
var warmup = new Warmup();
var factoryTools = _db.FactoryTools.Select(tool => new { tool.Factory });
}
您应该使用Entity Framework提供的本机异步方法,例如在此演示:https://msdn.microsoft.com/en-us/library/jj819165(v=vs.113).aspx
因此,您的GetWarmUp()
应为async Task<Warmup>()
并调用实体框架的本机异步方法之一。
有关可用异步扩展方法的列表,请参阅https://msdn.microsoft.com/en-us/library/system.data.entity.queryableextensions(v=vs.113).aspx。