不等待SaveChangesAsync()是否安全?

bru*_*_cw 1 c# entity-framework async-await asp.net-core

请考虑以下WebAPI方法:

[HttpPost]        
public async Task<IHttpResult> CreateWorkItem(Item wi)
{
    var item = await dataContext.Item.AddAsync(wi);
    await dataContext.SaveChangesAsync();
    return Ok();
}
Run Code Online (Sandbox Code Playgroud)

是否存在不await使用SaveChangesAsync()方法安全的情况?

理论上,如果我在后台完成对数据库的刷新时发送了响应,那么响应时间会更快.

我的假设是否正确?

Chr*_*att 6

await关键字没什么神奇之处.它的字面意思是"在继续之前等待这项任务完成".任务返回热门或已经开始,所以无论你是否等待他们,工作都在进行中.

但是,在您不等待任务完成的情况下,事情可能会变得危险.特别是,在这里,实际执行保存操作所需的上下文(请记住它拥有物理数据库连接)是请求范围的.这意味着如果您没有等待保存并从操作返回,那么您现在基本上处于竞争中,看看哪个完成了第一个:保存操作或请求结束.如果请求的结束(即最终响应被刷新到客户端)首先发生,则上下文将处理活动事务和SQL连接.

等待的另一个重要原因是适当的异常处理.如果你没有等待,那么在保存期间抛出的任何异常都将被吞下,因为代码已经移动了.这意味着您无法确保保存实际成功完成; 你所拥有的只是一个愿望和祈祷.

除了非常罕见的例外,所有异步任务都应该一直等待着.它并不总是需要在同一行(例如,当使用Task.WhenAll等待一系列任务的东西时),但在某些时候,await关键字应该在那里.FWIW,这些罕见的例外主要局限于桌面和移动开发,您经常需要在新线程上解决工作以防止阻塞主线程或UI线程.这对于Web应用程序来说并不是一个问题,因此您几乎可以考虑在该环境中"等待所有事情"规则.