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());
}