实现同步方法的异步版本:如何返回Task也就是常数1
本文关键字:Task int 常数 也就是 返回 异步 同步方法 版本 何返回 实现 | 更新日期: 2023-09-27 17:50:06
我有一个同步方法,现在我想实现它的异步版本。幸运的是,底层调用已经有一个async版本(dbSet.SaveChangesAsync()
),但是在我的算法中有一个if分支返回常量字面量1。
我不知道如何在异步版本中实现这一部分?
同步版本:
public virtual int Add(T entity)
{
SetLogContext(entity, _logctx);
dbSet.Add(entity);
if (isAutonomous)
{
return ctx.SaveChanges();
}
return 1;
}
异步版本:
public virtual Task<int> AddAsync(T entity)
{
SetLogContext(entity, _logctx);
dbSet.Add(entity);
if (isAutonomous)
{
return ctx.SaveChangesAsync();
}
return ??? // What to write here?
}
使用
return Task.FromResult(1);
您有两种可能性如何实现您的需求:一种是使用async
关键字:
public virtual async Task<int> AddAsync<T>(T entity)
{
SetLogContext(entity, _logctx);
dbSet.Add(entity);
if (isAutonomous)
{
return await ctx.SaveChangesAsync();
}
return 1;
}
另一种方法是在想要返回数字的地方使用Task.FromResult(1)
。
我在这里看到的问题是,你已经创建了一个"Async"方法,实际上不是async
。这可能会误导下一个使用它的人。
正如@xxMUROxx已经提到的,"Async"方法应该以async
关键字作为前缀。
public virtual async Task<int> AddAsync<T>(T entity)
{
SetLogContext(entity, _logctx);
dbSet.Add(entity);
if (isAutonomous)
{
return await ctx.SaveChangesAsync();
}
return 1;
}
使用async
await
模式的全部意义在于改变程序流经方法的方式。当命中await
关键字时,该方法返回到调用者,而通常会一直流回原始调用者。通常,这将是一个async void
事件处理程序,如按钮单击。
当这种情况发生时,它允许调用线程在等待长时间运行的操作完成时继续执行。在长时间运行的操作完成后,代码将创建一个延续,并继续执行依赖于返回结果的任何其他代码。
通过从方法中省略async
关键字,您已经有效地使调用再次同步。一开始就违背了调用SaveChangesAsync
的目的