实现同步方法的异步版本:如何返回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?
    }

实现同步方法的异步版本:如何返回Task<int>也就是常数1

使用

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的目的