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

C# 何时在EF Core中使用异步方法?,c#,visual-studio,entity-framework-core,core,asp.net-core-3.1,C#,Visual Studio,Entity Framework Core,Core,Asp.net Core 3.1,我正在使用SQL数据库构建一个应用程序,并使用以下CRUD操作: 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

我正在使用SQL数据库构建一个应用程序,并使用以下CRUD操作:

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)
{
wait_dbContext.Foos.AddAsync(foo);
wait_dbContext.saveChangesSync();
返回foo;
}
公共异步任务删除(int-id)
{
Foo-Foo=wait_-dbContext.Foos.FindAsync(id);
如果(foo!=null)
{
_dbContext.Foos.Remove(foo);
wait_dbContext.saveChangesSync();
}
返回foo;
}
是否只有在调用方法后仍然需要变量时才需要

Foo-Foo=await\u dbContext.Foos.FindAsync(id)中


如果我传入一个要添加到数据库的foo列表,该怎么办?

经验法则是在任何线程上使用async,因为它的繁忙类型等待会妨碍其他线程。对于async的使用,将有等待将其放在一边直到数据返回的操作

因此,如果您有一个处理多个调用的web服务,那么使用async/await可以很好地实现以保持web服务的响应性

是否只有在调用方法后仍然需要变量时才需要

一般来说,如果有异步API,那么您应该将它们用于新代码

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

实际的“经验法则”比这更复杂。通常,当您想要阻止当前运行的线程时,可以使用async Wait。这将释放线程用于其他任务(如更新UI),同时等待异步结果。这个问题处理得很好。详细描述了异步等待在引擎盖下的工作方式。