实现异步和同步方法
本文关键字:同步方法 异步 实现 | 更新日期: 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;
}