何时在EF Core中使用异步方法?

时间:2020-06-10 20:13:22

标签: c# visual-studio entity-framework-core core asp.net-core-3.1

我正在使用带有以下CRUD操作的SQL数据库构建应用程序:

public Foo Add(Foo foo)
{
    _dbContext.Foos.Add(foo);
    _dbContext.SaveChanges();
    return foo;
}

public Foo Delete(int id)
{
    Foo foo = _dbContext.Foos.Find(id);
    if(foo != null)
    {
        _dbContext.Foos.Remove(foo);
        _dbContext.SaveChanges();
    }
    return foo;
}

但是,其中一些方法具有异步版本。以下仍然有效:

public async Task<Foo> Add(Foo foo)
{
    await _dbContext.Foos.AddAsync(foo);
    await _dbContext.SaveChangesAsync();
    return foo;
}

public async Task<Foo> Delete(int id)
{
    Foo foo = await _dbContext.Foos.FindAsync(id);
    if(foo != null)
    {
        _dbContext.Foos.Remove(foo);
        await _dbContext.SaveChangesAsync();
    }
    return foo;
}

仅在调用方法后仍需要变量时才需要吗?

Foo foo = await _dbContext.Foos.FindAsync(id);一样

如果我要传递要添加到数据库中的Foos列表怎么办?

2 个答案:

答案 0 :(得分:0)

经验法则是在繁忙类型等待的任何线程上使用异步,这会妨碍其他线程。对于异步的使用,将具有等待将其搁置一旁直到数据返回的操作。

因此,如果您有一个可处理多个呼叫的Web服务,则可以很好地实现使用异步/等待以保持Web服务的响应性。

答案 1 :(得分:0)

仅在调用方法后仍需要变量时才需要吗?

通常来说,如果有异步API,则应将它们用于新代码。

异步代码释放了调用线程。如果您的应用程序是GUI应用程序,则可以释放UI线程。如果您的应用程序是服务器应用程序,则可以释放线程来处理其他请求。