实体框架Async与Task.FromResult

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)

Mic*_*nny 7

是的,因为如果ADO驱动程序使用IOCP线程池实现异步方法(并且确实如此),则不会使用工作线程等待操作,而是使用I/O完成端口的特殊等待机制,这样,当存在大量争用时,服务器应该能够最好地扩展,这种争用对数据库查询执行长期运行的IO操作.

检查一些文章,你可以找到谷歌搜索:

I/O完成端口

C#中的IOCP线程池

ADO.NET 2.0中的异步命令执行

从最后一个链接:

在以前版本的.NET Framework中,可以通过使用异步委托或ThreadPool类来模拟非阻塞执行; 但是,这些解决方案只是在后台阻止了另一个线程,这使得它们远非理想,因为它们必须避免阻塞线程...

ADO.NET/SqlClient异步命令执行支持基于真正的异步网络I/O(在共享内存的情况下为非阻塞信令).

...没有阻塞的后台线程等待特定的I/O操作完成,我们使用Windows 2000/XP/2003操作系统的重叠I/O和输入/输出完成端口功能使其成为可能使用单个线程(或其中一些)来处理给定进程的所有未完成请求.

编辑:从注释移到此处以扩展有关异步存储库模式的特定问题的答案:

我认为你应该公开你需要的那些Async方法,扩展通用存储库,避免耦合EF并避免任务包装,添加CountAsync,AddSync,FindAsync以及你需要的所有类型的方法async.

使用ENTITY FRAMEWORK 6检查异步存储模式

存储库示例:

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应用程序:存储库框架