实现异步和同步方法

本文关键字:同步方法 异步 实现 | 更新日期: 2023-09-27 18:30:10

我在WebApi项目中使用通用存储库模式遵循工作单元。目前我没有使用Linq和EF6提供的**Async方法。

但是我已经开始实现async了。所以现在一个存储库看起来是这样的:

public interface IRepository<T> where T : class
{
    void Add(T entity);
    void Update(T entity);
    void Delete(T entity);
    T Get(int id);
    T Get(Expression<Func<T, bool>> predicate);
    Task<T> GetAsync(int id, CancellationToken ct);
    Task<T> GetAsync(Expression<Func<T, bool>> predicate, CancellationToken ct);
}

工作单位:

public interface IUnitOfWork<C>
{
    int Commit();
    Task<int> CommitAsync(CancellationToken ct);
}

然后我有了服务层和所有的服务层,最重要的是控制器

最好的做法是同时使用异步和同步方法,还是现在只保留异步方法?

实现异步和同步方法

我认为方法是公开异步和同步方法。

另一个想法是为你提到的每个实体创建一个存储库,比如:

  public interface IUserRepository : IRepository<UserModel, int>
    {
        UserModel GetByEmail(string email);
        Task<UserModel> GetByEmail(string email);
     }

 public interface IRepository<TModel, TKey> where TModel : class
    {
    }

你可以尝试这样的方法,但理论上只是工作顺利,因为等待会阻塞当前线程。

public static async Task<Model> GetModelAsync()
{
    // async logic & return task
}
public static Model CallGetModelAsyncAndWaitForResult()
{
    var task = GetModelAsync();
    task.Wait(); // Blocks current thread 
    var result = task.Result;
    return result;
}