首页 > 解决方案 > 实体框架通用存储库模式异步添加方法和保存

问题描述

我有一个名为 Repository 的基础存储库类。谁能解释我应该如何使此类中的方法异步?

public abstract class Repository<TEntity> : IRepository<TEntity> where TEntity : Entity
{
    private readonly DbContext _context;
    private readonly DbSet<TEntity> _dbSet;

    public Repository(DbContext context)
    {
        _context = context;
        _dbSet = context.Set<TEntity>();
    }
    public TEntity Add(TEntity entity)
    {
        entity.CreateDate = DateTime.Now;
        _dbSet.Add(entity);
        Save();
        return entity;
    }
    public void Save()
    {
        _context.SaveChanges();
    }
}

我试图让它异步,但我无法决定添加和保存方法如何同时异步。我的实验在这里,它看起来不正确,因为它包含两个等待。

public abstract class Repository<TEntity> : IRepository<TEntity> where TEntity : Entity
{
    private readonly DbContext _context;
    private readonly DbSet<TEntity> _dbSet;

    public Repository(DbContext context)
    {
        _context = context;
        _dbSet = context.Set<TEntity>();
    }

    public async Task<TEntity> AddAsync(TEntity entity)
    {
        entity.CreateDate = DateTime.Now;
        await _dbSet.AddAsync(entity);
        await SaveAsync();
        return entity;
    }

    public async Task SaveAsync()
    {
        await _context.SaveChangesAsync();
    }
}

标签: c#asp.net-mvcasp.net-coreasync-awaitentity-framework-core

解决方案


实际上,你的基础仓库并没有错,但不幸的是,我们大多数人都是在 没有深入了解的情况下使用Asynchronous programmingand方式。无论如何,Async, await我建议访问此链接异步编程

1、await算子在异步方法中应用于任务,在方法执行中插入一个悬空起点,直到等待任务完成。任务指示正在进行的工作。

2、await只能用在async关键字修饰的异步方法中。这种类型的方法,用 async 修饰符定义,通常包含一个或多个 await 表达式,称为异步方法。

3、await的唯一目的就是在调用异步方法XXAsync()的时候挂起这个方法。它认为这个方法是一个耗时的方法,主线程,或者调用这个方法的线程。不要以这种方式等待。并同时标记。当前执行的线程运行结束后,会从这里恢复运行,所以await标签的异步方法下面的代码或方法不会运行。您必须等待此方法。执行!

4、加不加await,方法是异步还是同步都无所谓下面写个例子

 private static async Task XAsync()
  {            
     await  XXAsync();
     OtherMothod();   
  }

5 . 当运行到 await XXAsync() 时,对方法 XAsync() 的调用将不再运行并直接返回,就像我们程序代码中的 return 语句一样。这样做的好处是调用线程不会等待这个耗时的线程。直接让调用线程跑下来,

6 . 如果调用线程总是有await链向上,就像方法set方法中的return一样,会一层层向上返回,返回到主线程,每个“子线程”都等待耗时的I/O处理,例如操作数据库和网络流

7 . 我们希望多线程或多任务执行我们的程序,让耗时的任务得到执行,同时给调用者一个快速的响应,不管他是否完成了任务!这是真正的目的。

private static async TaskXAsync()
  {
           
    await  XXAsync();

    await  XXXAsync(); 
  }

XXXAsync() 必须等待 XXAsync() 方法执行!这不会影响调用者的响应速度,但会影响我们代码的执行效率,这与两种同步方式略有不同。

private static async TaskXAsync()
  {
           
    XX();

    XXX(); 
  }

像上面例子中的XX()和XXX()两个同步方法,不仅顺序而且调用者不能正确调用,也就是不能及时响应,必须等到两个方法都执行完。我希望这会有所帮助


推荐阅读