你什么时候等待任务?

tra*_*m_3 8 c# asynchronous entity-framework

说我有一个有一个Repository类的课DbContext.在这堂课中,我有一个方法:

public async Task<T> CreateAsync(T obj)
{
    var o = _dbSet.Add(obj);
    await _dbContext.SaveChangesAsync();
    return o;
}
Run Code Online (Sandbox Code Playgroud)

Service类中,我使用此方法来创建对象:

public async Task<MyObject> Create()
{
    return await _repository.CreateAsync(new MyObject());
}
Run Code Online (Sandbox Code Playgroud)

最后在我的api控制器中,MyObjectController我返回这个对象:

public async Task<IHttpActionResult> Get()
{
    return Ok(await _service.Create());
}
Run Code Online (Sandbox Code Playgroud)

我对所有这些asyncawait关键字感到困惑.我知道a Task是等待的.这是否意味着我可以只归还TaskCreateAsync没有既不等待CreateAsyncCreate然后最后等待它Get?它是否对我的应用程序有负面影响,我在等待示例中等待?

Ned*_*nov 4

这是否意味着我可以从 CreateAsync 返回任务,而无需在 CreateAsync 或 Create 中等待,然后最终在 Get 中等待它?

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

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

由于状态机和上下文切换,会有轻微的性能损失。成本通常远低于通话成本,但最终都会加起来。异步性能:了解异步和等待的成本是关于此主题的一篇很棒的文章。

正如 @Richard Szalay 所指出的,只需确保您最终完成await任务,否则发生的任何异常都将不被观察到并被吞噬。