[英]When should you await a Task?
假设我有一个具有DbContext
的Repository
类。 在这个课上我有一个方法:
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());
}
我对所有这些async
和await
关键字感到困惑。 我知道可以等待一个Task
。 这是否意味着我可以只从CreateAsync
返回Task
,而无需等待CreateAsync
或Create
,然后最终在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.