Cés*_*nso 2 asynchronous entity-framework task
使用Entity Framework中的System.Data.Entity提供的异步方法与使用Task.FromResult包装相同的非异步方法之间有什么区别吗?
例如 :
private Task<int> GetCountAsync()
{
return this._myDbContext.Set<MyEntity>().CountAsync();
}
Run Code Online (Sandbox Code Playgroud)
和
private Task<int> GetCountAsync()
{
return Task.FromResult(this._myDbContext.Set<MyEntity>().Count());
}
Run Code Online (Sandbox Code Playgroud)
是的,因为如果ADO驱动程序使用IOCP线程池实现异步方法(并且确实如此),则不会使用工作线程等待操作,而是使用I/O完成端口的特殊等待机制,这样,当存在大量争用时,服务器应该能够最好地扩展,这种争用对数据库查询执行长期运行的IO操作.
检查一些文章,你可以找到谷歌搜索:
从最后一个链接:
在以前版本的.NET Framework中,可以通过使用异步委托或ThreadPool类来模拟非阻塞执行; 但是,这些解决方案只是在后台阻止了另一个线程,这使得它们远非理想,因为它们必须避免阻塞线程...
ADO.NET/SqlClient异步命令执行支持基于真正的异步网络I/O(在共享内存的情况下为非阻塞信令).
...没有阻塞的后台线程等待特定的I/O操作完成,我们使用Windows 2000/XP/2003操作系统的重叠I/O和输入/输出完成端口功能使其成为可能使用单个线程(或其中一些)来处理给定进程的所有未完成请求.
编辑:从注释移到此处以扩展有关异步存储库模式的特定问题的答案:
我认为你应该公开你需要的那些Async方法,扩展通用存储库,避免耦合EF并避免任务包装,添加CountAsync,AddSync,FindAsync以及你需要的所有类型的方法async.
存储库示例:
public interface IRepository<T> where T : class
{
Task<int> AddAsync(T t);
Task<int> RemoveAsync(T t);
Task<List<T>> GetAllAsync();
Task<int> UpdateAsync(T t);
Task<int> CountAsync();
Task<T> FindAsync(Expression<Func<T, bool>> match);
Task<List<T>> FindAllAsync(Expression<Func<T, bool>> match);
}
Run Code Online (Sandbox Code Playgroud)
CountAsync实现:
public async Task<int> CountAsync()
{
return await _dbContext.Set<T>().CountAsync();
}
Run Code Online (Sandbox Code Playgroud)
直接从帖子中取出所有内容.
然后,您还可以扩展您的通用存储库.
编辑:添加了一些有用的读物:
通用工作单元和存储库(轻量级流畅)框架与示例Northwind ASP.NET MVC 5应用程序:存储库框架
| 归档时间: |
|
| 查看次数: |
1794 次 |
| 最近记录: |