实现异步和同步方法?

时间:2014-11-13 09:04:07

标签: c# asynchronous asp.net-web-api

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

但我已经开始实现异步。所以现在存储库看起来像这样:

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);
}

然后,我将服务层包含所有服务层,并在控制器

之上

最佳做法是同时使用异步和同步方法,还是仅保留异步方法?

1 个答案:

答案 0 :(得分:0)

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

另一个想法是为您引用的每个实体创建一个存储库,如:

  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;
}