将Async与WebAPI2和Entity Framework 6与.Net 4.6一起使用

时间:2016-11-17 18:21:08

标签: c# entity-framework async-await asp.net-web-api2

我已将控制器和服务层设置为最初不使用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 });
}

1 个答案:

答案 0 :(得分:1)

这不是最好的方法。如果可以,请避免在基础代码提供Task.RunTask等待时使用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