我们必须阅读两个select语句,它们需要并行运行,意味着应该一起等待。
var t1 = GetSomeData1(somParams);
var tWrite = await WriteData(someParams);
var t2 = GetSomeData2(somParams);
await Task.WhenAll(t1, t2);
注1写入介于之间,但在错误中,我们有时会看到这种错误,
System.InvalidOperationException:在上启动了第二个操作上一个操作完成之前的此上下文。这通常是由不同线程同时使用的同一实例引起DbContext。有关如何使用避免线程问题的更多信息DbContext,请参阅https://go.microsoft.com/fwlink/?linkid=2097913.在Microsoft.EntityFrameworkCore.Internal.CurrentDetector.EnterCriticalSection((在Microsoft.EntityFrameworkCore.Query.Interal.SingleQueryingEnumerable`1.Enumerator.MoveNext((
根据此。https://learn.microsoft.com/en-us/ef/ef6/saving/transactions默认事务隔离级别为READ COMMITED。
我知道read COMMITED中的读写会导致阻塞,但当我们混合读写时,会不会出现同样的错误。
建议如何避免此错误并使用并行读取。
当它在链接上从您的异常读取时:
实体框架核心不支持在同一DbContext实例上运行多个并行操作。这包括异步查询的并行执行和来自多个线程的任何显式并发使用。因此,总是立即等待异步调用,或者为并行执行的操作使用单独的DbContext实例。
当EF Core检测到试图同时使用DbContext实例时,您将看到一个InvalidOperationException,并显示如下消息:
在上一个操作完成之前,在此上下文上启动了第二个操作。这通常是由使用相同DbContext实例的不同线程引起的,但是实例成员不能保证是线程安全的。
当并发访问未被检测到时,可能会导致未定义的行为、应用程序崩溃和数据损坏。
https://learn.microsoft.com/en-us/ef/core/dbcontext-configuration/#avoiding-dbcontext线程问题