使用dbContext的同一实例同时使用。如何跟踪问题的根源?

问题描述 投票:0回答:1

System.InvalidoperationException:开始了第二次操作 在完成之前的操作之前,此上下文实例。这是 通常是由不同的线程同时引起的 dbContext的实例。有关如何避免线程的更多信息 DBContext的问题,请参阅 https://go.microsoft.com/fwlink/?linkId =2097913

UPD:要明确,我遵循上面的链接,阅读DBContext的工作原理并审查了我的代码。现在,我正在寻找找到错误的程序化方法。

找到问题根源的好方法是什么?我想以某种方式记录是否使用多个线程同时使用dbcontext的相同实例。

我已经审查了文档中描述的任何缺失或其他明显的并发陷阱的代码。

代码库太大,无法在这里共享。简而言之,有一个

await

BackgroundService

旋转20个线。每个线程都会创建一个新范围:

Task.Run()
我的理解是为每个范围创建一个新的dbContext实例,因为所有请求dbcontext的实例均以范围注册为范围:
public IMessageHandler Create()
{
    var scope = serviceProvider.CreateScope();

    return scope.ServiceProvider.GetRequiredKeyedService<IMessageHandler>(ServiceKeys.XYZ);
}

我不使用合并的DB上下文,btw.
    

不直接您的问题,但可能相关:
services.AddDbContext<MyDbContext>();

NOTICE
c# asp.net multithreading entity-framework
1个回答
0
投票
是一次性的。当它处置时 - 当GC掌握它时 - 将处理该范围(范围和瞬态)中创建的所有实例。

在这种情况下,您的

CreateScope
实例很可能会被处置。
您需要所有使用范围中资源完成资源的工作。
better做这样的事情:

IMessageHandler

(可以轻松地使其可重复使用的版本。)
    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.