gpt4 book ai didi

c# - 不等待 SaveChangesAsync() 是否安全?

转载 作者:太空宇宙 更新时间:2023-11-03 18:52:13 25 4
gpt4 key购买 nike

考虑以下 WebAPI 方法:

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

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

理论上,如果我在后台刷新数据库时发送响应,我的响应时间会更快。

我的假设是否正确?

最佳答案

await 关键字没有什么神奇之处。它的字面意思是“在继续之前等待此任务完成”。任务返回热,或已经开始,因此无论您是否等待它们,工作都在进行。

但是,在您不等待任务完成的情况下,事情可能会变得不稳定。特别是,在这里,实际执行保存操作所需的上下文(请记住它拥有物理数据库连接)是请求范围的。这意味着,如果您不等待保存并从操作中返回,那么您现在实质上是在争先恐后地看哪个先完成:保存操作还是请求结束。如果请求结束(即最终响应被刷新到客户端)首先发生,上下文将被释放,以获取事件事务和您的 SQL 连接。

等待的另一个重要原因是正确的异常处理。如果您不等待,保存过程中抛出的任何异常都将被吞没,因为代码已经移动了。这意味着您不能真正保证保存实际上已成功完成;你所拥有的只是一个愿望和祈祷。

除了非常罕见的异常(exception),所有异步任务都应该一直等待。它并不总是需要在同一行中(例如当使用诸如 Task.WhenAll 之类的东西来等待一系列任务时),但在某些时候 await 关键字应该在那里。 FWIW,那些罕见的异常(exception)主要局限于桌面和移动开发,您经常需要在新线程上启动工作以防止阻塞主线程或 UI 线程。对于 Web 应用程序而言,这不是一个远程问题,因此您几乎可以认为“等待所有事情”规则在该上下文中是通用的。

关于c# - 不等待 SaveChangesAsync() 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54891008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com