C# 你应该什么时候等待任务?

C# 你应该什么时候等待任务?,c#,entity-framework,asynchronous,C#,Entity Framework,Asynchronous,假设我有一个Repository类,它有一个DbContext。在这门课上,我有一个方法: public async Task<T> CreateAsync(T obj) { var o = _dbSet.Add(obj); await _dbContext.SaveChangesAsync(); return o; } 最后,在我的api控制器MyObjectController中,我返回这个对象,如下所示: public async Task<IH

假设我有一个
Repository
类,它有一个
DbContext
。在这门课上,我有一个方法:

public async Task<T> CreateAsync(T obj)
{
    var o = _dbSet.Add(obj);
    await _dbContext.SaveChangesAsync();
    return o;
}
最后,在我的api控制器
MyObjectController
中,我返回这个对象,如下所示:

public async Task<IHttpActionResult> Get()
{
    return Ok(await _service.Create());
}
公共异步任务Get() { 返回Ok(wait_service.Create()); } 我对所有这些
async
wait
关键字感到困惑。我知道一个
任务
正在等待。这是否意味着我可以从
CreateAsync
返回
任务
,而无需在
CreateAsync
Create
中等待,然后在
Get
中等待它?我像示例中那样进行等待是否会对我的应用程序产生负面影响

这是否意味着我可以直接从CreateAsync返回任务,而不在CreateAsync或Create中等待,然后在Get中等待它

是的,你可以这样做,实际上效率更高。如果您在执行等待时执行等待,则每个异步方法将生成一个状态机,这意味着需要更多的代码和更多的上下文切换

我像示例中那样进行等待是否会对我的应用程序产生负面影响

由于状态机和上下文切换,将有轻微的性能损失。成本通常比通话成本低很多,但最终都加起来了。这是一篇关于这个话题的好文章


正如@Richard Szalay所指出的,只需确保您最终
等待任务
,否则发生的任何异常都将被忽略,并将被吞噬

async and await用于希望方法异步运行的情况。 不带等待的异步是同步的

异步方法返回task或void 等待任务完成

所以在返回任务的方法之前使用wait

Get方法正在等待完成create()任务,该任务等待完成createAsync任务

等等

_dbContext.SaveChangesSync()是异步方法,因此需要aaawait,否则它可能返回错误的o


如果您需要更多的说明,请告诉我。值得注意的是,不等待而返回任务的缺点是,如果抛出异常,所讨论的方法将不在异步调用堆栈中。这一点很好,但他确实说过,他最终会在
Get
方法中等待它,因此异常将被抛出,但是我要明确指出,异常不会被吞没,但是没有等待的方法不会出现在异步调用堆栈上(这可能会使调试更加困难)。我很确定OP知道等待/asyn的作用。他的问题更像是“我应该使用多重等待还是单一等待?”
public async Task<IHttpActionResult> Get()
{
    return Ok(await _service.Create());
}