我正在构建一个带有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 = await _dbContext.Foos.FindAsync(id);
如果我传入一个要添加到数据库的Foos列表怎么办?
是不是只有在调用方法后还需要变量的时候才需要?
一般来说,如果有异步API,那么你应该在新代码中使用它们。
异步代码可以释放调用线程。如果你的应用是GUI应用,这可以释放UI线程;如果你的应用是服务器应用,这可以释放线程来处理其他请求。
经验法则是在任何线程上使用异步,因为它的 忙碌型 等待,会妨碍其他线程的运行。因为使用async会有等待的操作,把它踩在一边,直到数据返回。
因此,如果你有一个处理多个调用的web服务,使用asyncawait是很好的实现,以保持web服务的响应。