繁体   English   中英

您什么时候应该等待任务?

[英]When should you await a Task?

假设我有一个具有DbContextRepository类。 在这个课上我有一个方法:

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

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

public async Task<MyObject> Create()
{
    return await _repository.CreateAsync(new MyObject());
}

最后,在我的api控制器MyObjectController我像下面这样返回该对象:

public async Task<IHttpActionResult> Get()
{
    return Ok(await _service.Create());
}

我对所有这些asyncawait关键字感到困惑。 我知道可以等待一个Task 这是否意味着我可以只从CreateAsync返回Task ,而无需等待CreateAsyncCreate ,然后最终在Get等待它? 是否像示例中那样对我的应用程序产生负面影响?

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

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

是否像示例中那样对我的应用程序产生负面影响?

由于状态机和上下文切换,性能会稍有下降。 费用通常比通话费用低得多,但最终总会加起来。 异步性能:了解异步和等待的成本是有关此主题的精彩文章。

正如@Richard Szalay指出的那样,只需确保您最终await该任务,否则发生的任何异常都不会被观察到并且会被吞下。

当您希望方法异步运行时,将使用async和await。 没有等待的异步是同步的

异步方法返回任务或无效等待任务完成

因此在返回任务的方法之前使用了await

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

等等。

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

让我知道是否需要进一步说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM