and*_*eas 2 .net c# performance entity-framework async-await
我试图找出使用异步等待通过实体框架选择数据的最佳方法.在以下代码中,我有两个选项.
第一个使用Task.FromResult.
第二个选项尝试使用async await关键字来优化代码.
1.
public Task<IEnumerable<DesignExample>> ExecuteAsync(GetAllExamplesQuery query)
{
var designExamples = _copyDataDb.DesignExamples.OrderBy(dE => dE.Order).Select(DesignExample.MapFromEntity);
return Task.FromResult(designExamples);
}
Run Code Online (Sandbox Code Playgroud)
2.
public async Task<IEnumerable<DesignExample>> ExecuteAsync(GetAllExamplesQuery query)
{
var designExamples = await _copyDataDb.DesignExamples.OrderBy(dE => dE.Order).ToListAsync();
return designExamples.Select(DesignExample.MapFromEntity);
}
Run Code Online (Sandbox Code Playgroud)
Yuv*_*kov 13
这些方法做了两件事.
你的前者执行DbContext 同步调用并将结果包装在一个Task.这意味着调用线程在调用数据库时不会将控制权返回给调用者.这种方法的消费者可能不明白为什么这ExecuteAsync会阻塞他们的线程.
后者使用它来进行异步调用,ToListAsync从而释放调用线程.这意味着调用者可以在此期间对该线程执行更多操作,并且在查询完成执行时将继续执行.
第二种选择是否会提高与第一种选择相关的整体表现?
为了知道您必须测量代码,这主要取决于执行查询所需的时间.请注意,使用async-await确实会产生开销(尽管对于代码可读性的增益而言是最小的)生成封面后面的状态机.请注意,您无法对同一个DbContext执行多个查询.
第二个选项将等待对数据库的调用,但这会在这种情况下给我带来什么好处吗?
这样做的主要好处是,当查询运行时,您的线程可以自由地完成更多工作.在像ASP.NET这样的环境中,这意味着ASP.NET ThreadPool可以在此期间自由处理更多的传入请求,这实际上取决于您要实现的目标.
有关使用异步数据库调用的有趣讨论为什么EF 6教程使用异步调用?我认为你会觉得有趣.