【发布时间】:2022-01-13 03:16:51
【问题描述】:
使用 await 如何使代码线程安全?
Entity Framework Core 不支持多个并行操作 在同一个 DbContext 实例上运行。这包括并行 执行异步查询和任何显式并发使用 多个线程。因此,总是立即等待异步调用,或者 对执行的操作使用单独的 DbContext 实例 并行。
说 1 db 调用正在进行中,线程 1 正在上面。当它在其中工作时;
案例一:
假设我没有使用异步。另一个线程进行并行调用,因此会发生冲突和错误。
案例 2:
假设我使用异步。另一个线程进行了并行调用:
案例 2.a:由于我们使用异步,当第一个线程发出请求并等待响应时,它将释放线程,因此线程 2 在发出请求时不会发生冲突。我明白这一点。
案例 2.b 如果两个线程真的同时发出请求会怎样。
案例 2.b 是否可行,在这里使用 async 是否有帮助?
【问题讨论】:
-
不能在同一个 DbContext 上执行并发操作。您不必这样做也没有意义:DbContext 是一个工作单元,而不是数据库连接。不要试图让它表现得像一个连接或强迫它同时做任何事情。如果某些操作很慢,请找出原因而不是尝试“并行化”它
-
文档意味着实体框架支持异步操作,但不支持异步并行操作。因此,在实体框架的一个实例上一次运行一个异步操作并完成(等待位)实体框架实例上的任何其他类型的并行操作将引发异常
-
DbContext 是一个工作单元。这意味着对其跟踪的对象的任何修改不会持久化,也不会立即持久化。在请求/业务事务/工作结束时,对
SaveChangesAsync的单次 调用将为所有实体保留所有 未决更改。SaveChangesAsync实质上提交了工作单元。这比尝试坚持每个单独的更改要快很多 -
换一种说法,DbContext 实例是一辆载有所有乘客(变更)到目的地(数据库)的公共汽车。你不能拆分那辆公共汽车。并且尝试为每位乘客使用公共汽车将比等待所有人上车要慢得多
标签: c# .net multithreading entity-framework .net-6.0