假设我有一个Repository
类,其中DbContext
。在这堂课中,我有一个方法:
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
是等待的。这是否意味着我可以从Task
返回CreateAsync
而无需等待CreateAsync
或Create
,然后最终在Get
等待它?它是否会对我的应用程序产生负面影响,就像我在等待示例一样?
答案 0 :(得分:4)
这是否意味着我可以直接从CreateAsync返回任务而无需同时在CreateAsync或Create中等待,然后最终在Get中等待它?
是的,你可以做到这一点,它实际上更有效率。如果您正在进行等待,每个异步方法将生成一个状态机,这意味着更多的代码和更多的上下文切换
它是否会对我的应用程序产生负面影响,就像我在等待示例一样?
由于状态机和上下文切换,会有轻微的性能损失。成本通常远低于通话成本,但最终都会增加。 Async Performance: Understanding the Costs of Async and Await是关于此主题的精彩文章。
正如@Richard Szalay指出的那样,只要确保你最终await
该任务,否则任何发生的异常都将被忽视并被吞噬。
答案 1 :(得分:0)
async和await。 没有等待的async是一个同步
异步方法返回任务或无效 等待任务完成
所以await在返回任务
的方法之前使用您的Get方法正在等待完成您的create()任务,该任务等待完成createAsync任务
等等。
_dbContext.SaveChangesAsync()是异步方法,因此需要aaawait,否则可能返回错误o
如果您需要进一步澄清,请告诉我